Einige Fragen zu OpenCL



  • Hallo,
    ich bin gerade richtig im OpenCL-Wahn - CUDA kommt wegen fehlender Nvidia-Graka nicht in Frage - beschäftige mich seit einer Woche auch mit dem Buch "OpenCL Programming Guide" (Addison Wesley), stoße jedoch auf Sachen, die mir ein wenig Kopfzerbrechen bereiten.

    1. Die Funktion clEnqueueNDRangeKernel erwartet von mir, dass ich als Parameter "globalWorkSize" und "localWorkSize" angebe - in den Beispielen wird die globalWorkSize auf die Anzahl der Datensätze gesetzt, was ja noch nachzuvollziehen ist, da ich dann im Kernel mit get_global_id(0) die Aufgaben gut verteilen kann. localWorkSize ist meistens 1 - wieso? Was für Änderungen würde es ergeben, wenn man diese gleichsetzt mit globalWorkSize?

    2. Man nehme an, ein Program bestehe aus mehreren Kernels.
    Der erste nimmt als ersten Parameter einen Zeiger auf einen kompletten Datensatz (readonly struct(data) array) bestehend aus 100.000 Zeilen (ca. 30MB), als zweiten Parameter ein Zeiger (writeonly) auf einen gleichgroßen leeren Array.

    kernel void kernel_one(global data * datensatz, global double * output)
    

    Nach Aufruf dieses Kernels soll sofort der zweite Kernel aufgerufen werden, mit folgendem Kopf:

    kernel void kernel_two(global data * datensatz, global double * output2)
    

    Der erste Parameter ist exakt der selbe Datensatz, output2 ist wie output oben, nur mit anderen Berechnungen.

    Und zuguterletzt folgt ein Aufruf des dritten Kernels:

    kernel void kernel_three(global double  *output, global double * output2, global double * sum)
    

    Frage: Wie man sieht, wird im Kernel 1 und 2 der selbe Datensatz verwendet, und im Kernel 3 die Ausgaben der ersten beiden. Gibt es eine Möglichkeit, nicht immer wieder die Daten von Host auf Device und andersrum verschieben zu müssen?

    Das war's vorerst mit den Fragen - ich hoffe, ihr versteht mich!^^

    Gruß, dommynik


  • Mod

    die global work size ist die groesse der daten die du verarbeiten willst, local work group size ist die chunk groesse in der die hardware das verarbeitet. deine hardware hat eine gewisse anzahl an cores, jeder schnappt sich soeine locale work group und arbeitet diese ab. dabei haben unterschiedliche prozessoren auch unterschiedliche limitierungen, manche werden nicht mit zukleinen sizes richtig laufen und mit zu grossen erst garnicht starten. du kannst kernels compilieren und dann fragen wieviele workitems in der local group size sein duerfen.

    2. beim erstellen von buffern mit clcreatbuffer kannst du als einen parameter angeben wo sich dieser buffer befindet.



  • Danke für die Antwort!

    Ich gehe davon aus, dass ich readonly-buffer mit CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR erstellen muss?

    Nächste Frage:
    Ich kriege beim dritten Kernel ein Array sum als Ausgabe. Wie kann ich auf dem Device die Summe eines Arrays berechnen? Immerhin muss ja immer auf ein Speicherbereich zugegriffen werden!

    kernel void sum_array(global double * arr, global double * sum) { ... }
    

  • Mod

    kann es sein dass du dein opencl buch noch nicht durch hast?
    in dem fall empfehle ich dir schritt fuer schritt dem buch nach vorzugehen, verpasst du die wichtigen details, wirst du gewichtige probleme mit allem nachfolgendem haben.



  • rapso schrieb:

    kann es sein dass du dein opencl buch noch nicht durch hast?
    in dem fall empfehle ich dir schritt fuer schritt dem buch nach vorzugehen, verpasst du die wichtigen details, wirst du gewichtige probleme mit allem nachfolgendem haben.

    nein, habe ich noch nicht, bin bei der hälfte - trotzdem dachte ich, dass mir eine deutsche erklärung vielleicht etwas einfacher in den kopf geht. außerdem sind viele beispielcodes in dem buch einfach mist, denn es beinhaltet so viele fehler, bei denen ich mir nicht sicher bin, wie sie richtig sind.

    na gut, dann schau ich mal, ob es noch foren gibt, wo man einem hilft. hm


Anmelden zum Antworten