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?
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?
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.
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?
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 | ^ |
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.
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.
Es gibt eine Funktion clCreateBuffer() mit der man Speicher anfordern kann.
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];
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.