Array kopieren in C, Länge nur zur Laufzeit bekannt

Gast #2631359
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?
Gast #2631716
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?
Gast #2631735
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
                ^
#2631989
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren