www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Maxim (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Maxim (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Maxim (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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
float tmp[Nx * Ny * Nz];
diesen Fehler
/tmp/OCL75Z6LH.cl(8): error: expression must have a constant value
      float tmp[Nx * Ny * Nz];
                ^

Autor: Joachim Drechsel (Firma: JDCC) (scheppertreiber)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Maxim (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Mark Brandis (markbrandis)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Es gibt eine Funktion

clCreateBuffer()

mit der man Speicher anfordern kann.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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];

Autor: Rolf Magnus (rmagnus)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net