OpenCL



  • Was genau hat das mit dem Thema zu tun?

    Abgesehen davon: Ein Array kann implizit in einen Zeiger auf das erste Element konvertiert werden. Und ein Zeiger auf ein Objekt kann implizit in einen void* konvertiert werden. Im zweiten Fall wird implizit Array in Zeiger und Zeiger in void* gewandelt, im ersten Fall wird Array implizit in Zeiger auf erstes Element konvertiert, was im Falle eines zweidimensionalen Arrays wieder ein Array ist (ein mehrdimensionales Array ist ein Array aus Arrays). Und T (*bla)[3] deklariert genau so einen Zeiger auf ein Array (ohne Klammern würde der * zum T zählen und stattdessen ein Array aus Zeigern deklariert)...



  • Ein Array kann implizit in einen Zeiger auf das erste Element konvertiert werden

    Jedes array egal welcher Größe/Dimension kann auf einen Zeiger auf das erste Element konvertiert werden ?



  • blurry333 schrieb:

    Ein Array kann implizit in einen Zeiger auf das erste Element konvertiert werden

    Jedes array egal welcher Größe kann auf einen Zeiger auf das erste Element konvertiert werden ?

    Ja, das sind nun aber wirklich Grundlagen die du beherrschen solltest, wenn du dich mit Dingen wie OpenCL beschäftigen möchtest...



  • aber

    float* ptr = arr;
    

    geht nicht. nur

    void* ptr;
    


  • Ja, denn eine Standard Conversion Sequence kann nur eine Array to Pointer Conversion beinhalten...



  • Es macht keinen Sinn openCL zu nutzen, wenn man nichtmal c versteht, es baut sehr darauf auf. Blinder Pilot...



  • Noch mal zur Klarstellung.

    Es gibt momentan die OpenCL Spezifikation 1.2. Dort werden die Schnittstellen beschrieben.

    Implementiert jeder Hersteller diese Schnittstellen anders oder verwenden Sie alle denselben Source Code und kompilieren ihn nur für ihren jeweiligen Chip ?



  • OpenCL spezifiziert eine Schnittstelle und jeder Hersteller der OpenCL implementieren will, implementiert eben diese Schnittstelle.



  • Warum dann nicht eine supertolle Implementierung veröffentlichen und jeder Hersteller übernimmt diese und spart sich monatelangen Aufwand für eine eigene Implementierung 🙂



  • Und in dieser tollen Implementierung, wie genau funktioniert da die Kommunikation mit der Grafikhardware



  • blurry333 schrieb:

    Warum dann nicht eine supertolle Implementierung veröffentlichen und jeder Hersteller übernimmt diese und spart sich monatelangen Aufwand für eine eigene Implementierung 🙂

    Das ist eine super Idee.
    Setz dich hin, mach das und komm erst dann wieder wenn du es fertig implementiert hast.
    Das waere toll 🙂



  • in meinem Buch findet sich folgendes

    // kernel Adresse
    errNum = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObjects[0]);
    // kernel dereferenziert
    errNum = clSetKernelArg(*kernel, 0, sizeof(cl_mem), &memObjects[0]);
    

    Das *kernel muss doch ein Fehler sein oder ??



  • Hängt davon ab was kernel ist, aber eine der beiden Zeilen ist sehr wahrscheinlich falsch...



  • Ich denke *kernel ist falsch. Steht so im Buch Programming Guide OpenCL drin. Sogar mehrmals.



  • Weiß jemand ob ich hier beide for schleifen parallelisien kann ?

    Da der Index der 2.Schleife von der ersten abhängt , tu ich mich etwas schwer.

    for(int i=0;i<dim;i++)
    	{
    
    	   for(int j =0 ; j<i;j++)
    	   {
    		  c[i]+= (l[i*dim+j] *c[j])*(-1);
    	   }
    
    	}
    


  • Die 1.Schleife bekomm ich locker weg.

    int i = get_global_id(0) ;
    

    Aber ich frag mich ob die 2.Schleife auch möglich wäre



  • blurry333 schrieb:

    Weiß jemand ob ich hier beide for schleifen parallelisien kann ?

    ich denke das ist nicht ohne weiteres moeglich da du hier:

    c[i]+= (l[i*dim+j] *c[j])*(-1);

    die resultate der vorherigen durchlaeufe fuer die naechsten durchlaeufe benutzt.

    du kannst die innere schleife verbessern, da alles auf c[i] schreibt, falls i grosse genug wird, koenntest du eine art parallel reduce machen.



  • Oder versteh ich das richtig. Der Parameter der Funktion

    get_global_id( int dimension)
    

    ist selbst schon eine Verschachtelung.

    get_global_id(0)  // 1.for schleife
    get_global_id(1)  // 2.for schleife
    

    Ich muss also gar nichts weiter machen?



  • Kann mir mal einer sagen was es genau bedeutet wenn man

    get_global_id(int dimension)
    

    mit verschiedenen Parametern aufruft ?

    get_global_id (0) liefert meines Wissens die ID des aktuellen Workitems. Aber was bedeutet 1 oder 2 als Parameter ??



  • Ich zitier hier mal aus einem Tutorial:

    OpenCL kernels are executed over an index space, which can be 1, 2 or 3 dimensional


Anmelden zum Antworten