Forum: PC-Programmierung Array kopieren in C, Länge nur zur Laufzeit bekannt


von Maxim (Gast)


Lesenswert?

Hallo Programmierer!

Ich nutze OpenCL, welches auf C basiert. Hierbei werden Codeabschnitte, 
die auf z.B. GPUs laufen sollen, in externe Methoden - sog. Kernels - 
ausgelagert. Diese Kernels werden zur Laufzeit kompiliert und in das 
eigentliche Programm - den Host - dynamisch eingebunden. Nun übergebe 
ich so einem Kernel ein vom Host erzeugtes 1d-float-Array. Weil der Host 
in Python programmiert wird, sind dynamische Arraygrößen bei der 
Initialisierung kein Thema. Im Kernel brauche ich ein temporäres Array, 
welches die selbe Größe hat wie das übergebene.
Und hier komme ich nicht weiter, weil ich erst zur Laufzeit wissen kann, 
wie groß das zu kopierende Array ist. C unterstüzt aber keine variablen 
Arraygrößen bei der Initialisierung. Wie kann ich diese Einschränkung 
umgehen ohne auf C99 auszuweichen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Maxim schrieb:
> C unterstüzt aber keine variablen
> Arraygrößen bei der Initialisierung. Wie kann ich diese Einschränkung
> umgehen

Was spricht gegen malloc/calloc?

von Maxim (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Was spricht gegen malloc/calloc?

Das wird con OpenCL C leider nicht unterstützt. Gibt es andere 
Möglichkeiten? Wenn nicht, wie stelle ich meinen Compiler auf C99 um? 
Ich arbeite unter Ubuntu 11.10, gcc 4.6.1.

von Rolf Magnus (Gast)


Lesenswert?

Maxim schrieb:
> Rufus Τ. Firefly schrieb:
>> Was spricht gegen malloc/calloc?
>
> Das wird con OpenCL C leider nicht unterstützt. Gibt es andere
> Möglichkeiten? Wenn nicht, wie stelle ich meinen Compiler auf C99 um?
> Ich arbeite unter Ubuntu 11.10, gcc 4.6.1.

Was versprichst du dir davon? Außerdem dachte ich, du arbeitest mit 
Python und OpenCL. Wo kommt dann der C-Compiler ins Spiel?

von Maxim (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Was versprichst du dir davon? Außerdem dachte ich, du arbeitest mit
> Python und OpenCL. Wo kommt dann der C-Compiler ins Spiel?

Hast recht, das war natürlich Blödsinn. Ich dachte, der gcc-Compiler mit 
irgend welchen Erweiterungen ist dafür zuständig. Ich der OpenCL 
Dokumentation finde ich keine Compileroptionen zu C99.

Jedenfalls verursacht folgende Zeile
1
float tmp[Nx * Ny * Nz];
diesen Fehler
1
/tmp/OCL75Z6LH.cl(8): error: expression must have a constant value
2
      float tmp[Nx * Ny * Nz];
3
                ^

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

alloc() benötigt auch die Größe des Speicherbereichs.

Ich vermute, das Einfachste wäre, der Funktion die benötigte Größe
mitzugeben. Die aufrufende Funktion sollte die ja kennen.

von Maxim (Gast)


Lesenswert?

Joachim Drechsel schrieb:
> Ich vermute, das Einfachste wäre, der Funktion die benötigte Größe
> mitzugeben. Die aufrufende Funktion sollte die ja kennen.

Hallo und danke. Nx, Ny und Nz werden alle mitgegeben und sind während 
der ganzen Laufzeit des Kernels sogar konstant.

von Mark B. (markbrandis)


Lesenswert?

Es gibt eine Funktion

clCreateBuffer()

mit der man Speicher anfordern kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Joachim Drechsel schrieb:
> alloc() benötigt auch die Größe des Speicherbereichs.

Und? Die scheint ja bekannt zu sein:

Maxim schrieb:
> Jedenfalls verursacht folgende Zeile
>  float tmp[Nx  Ny  Nz];

von Rolf M. (rmagnus)


Lesenswert?

Maxim schrieb:
> Rolf Magnus schrieb:
>> Was versprichst du dir davon? Außerdem dachte ich, du arbeitest mit
>> Python und OpenCL. Wo kommt dann der C-Compiler ins Spiel?
>
> Hast recht, das war natürlich Blödsinn. Ich dachte, der gcc-Compiler mit
> irgend welchen Erweiterungen ist dafür zuständig. Ich der OpenCL
> Dokumentation finde ich keine Compileroptionen zu C99.

OpenCL ist zwar C sehr ähnlich, aber doch eine eigene Sprache. Da gibt 
es auch eine gut lesbare Sprachdefinition dazu, wo das alles drin steht.
Und auch unter http://de.wikipedia.org/wiki/OpenCL#OpenCL_C steht schon 
als einer der Unterschiede zu C99 (ganz unten): "Arrays dürfen keine 
variable Länge haben."

Mark Brandis schrieb:
> Es gibt eine Funktion
>
> clCreateBuffer()
>
> mit der man Speicher anfordern kann.

Das wäre dann auf der Host-Seite. Nur wird ja ein einzelner Buffer nicht 
ausreichen. Der Kernel läuft ja n mal parallel, und wenn der diesen 
Speicher intern braucht, wird jede Instanz einen eigenen benötigen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.