OpenCL
-
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]; }