OpenCL



  • 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



  • Wie startest du denn deinen Kernel?



  • for(int i = 0;i<dim;i++)
    {
       for(int j=0;j<dim;j++)
    
        result[dim*i+j] = a[dim*i+j]+ b[dim*i+j];
    }
    

    so würde ich das in OpenCl machen:

    __kernel void meinkernel(__global float* a,_global float* b; __global float*    result,const int dim)
    {
      int i = get_global_id(0);
      int j = get_global_id(1);
    
    result[dim*i+j] = a[dim*i+j]+ b[dim*i+j];
    
    }
    

    Aber sobald mehr als eine Schleife fehlt mir das Verständnis da ich nicht mit dem Parameter von get_global_id() zurechkomme.



  • Ich erklärs mir jetzt so.

    Sagen wir haben 4 workitems.

    mache ich get_global_id(0) also eindimensional gibt es
    das workitem 0, workitem 1, workitem 2 und workitem 3.

    mache ich aber get_global_id(0) und get_global_id(1)
    dann gibt es das workitem[0][0], das workitem [0][1] , das workitem [0][2]
    und workitem [1][0], workitem[1][1] usw und so fort.

    Die Id ist eben dann 2-dimensional.

    Stimmt die ERklärung ??

    Dann müßte auch mein Code stimmen.



  • Lässt sich eine Matrizmultiplikation parallelisieren.

    for(int i = 0;i<dim1;i++)
    	{
    		for(int j =0 ; j<dim1;j++)
    		{
    			rechteseite[i]+=matrix[i*dim+j]*ergebnisvektor[j];
    		}
    
    	}
    


  • Mein Kernel Code schaut so aus. Aber irgendwas läuft schief 😞

    __kernel void ergebnis_kernel(const int dim, __global  float *mat,
                                                 __global  float *vektor,
    					     __global  float *rechteseite)
    {
        int i = get_global_id(0);
    	int j = get_global_id(1);
    
    	rechteseite[i]+=mat[i*dim+j]*vektor[j];
    }
    

Anmelden zum Antworten