[OPENCL]Addition zum Pointer oder eine Adresse rauskriegen mit & geht in OPENCL nicht?



  • Hallo Zusammen,
    Man sagt dass Opencl C99 oder sogar neuere C Standart erfüllt, auf papier.
    Aber ein Stück von Code geht die normale Verwahlten von Pointer nicht,
    z.B. Zeiger auf 2 Bytes ( unsigned short) in Datenarray auszuwählen:

    __global unsigned char * buffer;...
    ...
    unsigned int tolookPos = (irgendein Zahl)
    
    unsigned short *l2Num = &(buffer[tolookPos]);// << SYNTAXFEHLER!!!!
    

    Es geht auch nicht mit unsigned char * l2Num,
    oder mit

    unsigned short *l2Num = buffer + tolookPos
    

    verschiedene Kasten wie (unsigned short 😉 sind auch voll egal.
    wie kriege ich den Blöden Pointer auf 2 bytes raus? Und generell,
    was ich für ein Problem in GPGPU mit Pointer so umzugehen?
    Oder wird es da irgendwie anders gescheirben?

    als ich weiss, in CUDA wäre es erlaubt

    ... = &(buffer[tolookPos]);
    und nicht = buffer + tolookPos;
    was eigentlich dasselbe ist.

    P.S. S T A N D A R T ist kein Beleidigung desweger die Sterne daraus zu machen ist unangemessen 😡



  • Du bist da gerade im Bereich der Variablendefinition. Da ist einiges anders
    Wo zeigt denn buffer hin?

    Wie lautet die genaue Fehlermeldung?

    o4kareg schrieb:

    P.S. S T A N D A R T ist kein Beleidigung desweger die Sterne daraus zu machen ist unangemessen 😡

    Trotzdem ist es falsch.
    Angemessen wäre, sich über die richtige Schreibweise zu informieren. 🙂
    Die Art und Weise wie Etwas/Jemand steht hat damit nichts zu tun.



  • Nein, es ist innerhalb eine Methode die als eine Eingabewariable den buffer
    Zeiger(Array) hat. Anstatt von o.g. Codefragment funktioniert voll richtig
    dieses :

    unsigned short l2Num = buffer[tolookPos] << 8 + buffer[tolookPos+1] ;
    

    Hier habe ich aber extra die Rechneroperationen.



  • o4kareg schrieb:

    Man sagt dass Opencl C99 oder sogar neuere C stan**** erfüllt, auf papier.

    In der Wikipedia ist nur von "basiert" und nicht von "erfüllt" die Rede. Explizit sind auch Einschränkungen erwähnt. Beispielsweise dürfte demnach Deine Pointerarithmetik nur bei Arrays fester Länge funktionieren.

    Gestehe, dass ich keinerlei Erfahrung damit habe, aber aus dem wenigen Gelesenen erscheint mit Deine Fehlermeldung nur logisch.

    Ciao, Allesquatsch



  • Ist es auf deinem System überhaupt möglich, ein short auf eine ungerade Adresse zu legen?



  • DirkB schrieb:

    Ist es auf deinem System überhaupt möglich, ein short auf eine ungerade Adresse zu legen?

    1)Wieso nicht?
    2) Ist erst egal da dies als SYNTAXFEHLER bezeichnet wird nicht laufzeitfehler oder so.
    Genauer kann ich nicht sagen, in OpenCL bekommt man keine klare Fehlermeldung, höchstens kann man rauskriegen in welcher Zeile das Fehler ist.



  • o4kareg schrieb:

    P.S. S T A N D A R *

    Ist eine wohl eine Beleidigung, für die Augen.

    Würde mich nicht wundern wenn in OpenCL so einiges nicht geht, ist ja schließlich von Apple, kann also nur Kappes sein.



  • Warum machst du kein Array fester Länge?



  • Dein buffer liegt offenbar im __global Adressraum, also sollte l2Num wohl auch dort hinzeigen:

    __global unsigned short *l2Num = &(buffer[tolookPos]);
    

    o4kareg schrieb:

    DirkB schrieb:

    Ist es auf deinem System überhaupt möglich, ein short auf eine ungerade Adresse zu legen?

    1)Wieso nicht?

    Alignment und so, sollte aber eher nur für die Performance eine Rolle spielen...

    o4kareg schrieb:

    1. Ist erst egal da dies als SYNTAXFEHLER bezeichnet wird nicht laufzeitfehler oder so.
      Genauer kann ich nicht sagen, in OpenCL bekommt man keine klare Fehlermeldung, höchstens kann man rauskriegen in welcher Zeile das Fehler ist.

    Du könntest uns den GENAUEN Syntaxfehler nennen, den der Compiler dir gibt...



  • Da OpenCL keinerlei dynamische Speicherstrukturen in den Kernels erlaubt, denke ich dass Zeiger allgemein nicht (richtig) definiert sind.



  • MisterX schrieb:

    Da OpenCL keinerlei dynamische Speicherstrukturen in den Kernels erlaubt, denke ich dass Zeiger allgemein nicht (richtig) definiert sind.

    Ich hab keine Ahnung von was du redest...


Anmelden zum Antworten