OpenCL
-
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
-
Wie startest du denn deinen Kernel?