Kernel wird scheinbar nicht ausgeführt?! (__local)

m2c1
Windoof-User
Windoof-User
Beiträge: 41
Registriert: 20. Dez 2010 10:39

Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von m2c1 » 29. Jan 2012 12:34

Hi,

ich verzweifle gerade daran herauszufinden, warum folgende Zeile im .cl-Coderahmen nicht alle Einträge der Ausgabe auf 0 setzt:

Code: Alles auswählen

result[get_global_id(1) * sequenceLength + get_global_id(0)] = 0.0;
Davor hatte ich einen etwas längeren Code (bei dem ich mich an den nvidia-Beispielen orientiert habe) und auch dieser verändert die Ergebnismatrix (bzw. test.fasta.MI.out) nicht. Da außerdem die execution time immer bei 0 bleibt (die Ausgabe aber ansonsten korrekt geschrieben wird, das Programm also scheinbar durchläuft), frage ich mich, ob der Kernel-Code evtl. gar nicht ausgeführt wird?
:?: Kann das sein? Kann ich das irgendwie testen? Habt ihr noch andere Ideen?

Danke!


Update 1: Betreff um "(__local)" ergänzt, da hier wohl die Ursache liegt
Zuletzt geändert von m2c1 am 29. Jan 2012 14:38, insgesamt 1-mal geändert.

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Kernel wird scheinbar nicht ausgeführt?!

Beitrag von mw1039 » 29. Jan 2012 13:55

Wenn du mit dem Nvidia-SDK unter Windows und Visual Studio arbeitest, muesste es moeglich sein alles im Debugger zu starten. Unter Linux auch aber da ist es sicher nicht so komfortabel.
Mit den anderen SDKs weiss ich nicht, ob Debugging moeglich ist. Aber zumindest kann man dort in den Kernel auch printfs einbauen (pass aber auf, dass du nur den 0ten Thread Ausgaben machen laesst, sonst wird die Ausgabe zu lang). In einem der anderen Forenthreads hatten Kommilitonen Hinweise gepostet, wie man printf im Kernel benutzt.

Dennis Albrecht
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 222
Registriert: 4. Okt 2010 18:15

Re: Kernel wird scheinbar nicht ausgeführt?!

Beitrag von Dennis Albrecht » 29. Jan 2012 14:02

Kann es sein, dass du (zum Beispiel auf dem Cluster arbeitest oder auf einem anderen System, wo du OpenCL nicht auf der CPU ausführen kannst) und beide Schalter nicht gesetzt hast (oder irgend einen ähnlichen Fehler, bei dem zwar die Zeitmessung funltioniert, aber das Ergebnisfile nicht überschrieben wird und du so gefolgert hast, dass das Programm das richtige file schrieben würde, obwohl es eigentlich gar kein file schreibt.)

Etwas ungünstig formuliert: Lösch mal das Ergebnisfile, lass dein Programm laufen (auf der GPU!!) und schau nochmal, ob das richtige File geschrieben wird.

Gruß

m2c1
Windoof-User
Windoof-User
Beiträge: 41
Registriert: 20. Dez 2010 10:39

Re: Kernel wird scheinbar nicht ausgeführt?!

Beitrag von m2c1 » 29. Jan 2012 14:36

Vielen Dank für eure schnellen Antworten! Zufällig hab' ich den Fehler jetzt gefunden. Ich habe die Methode oclMIcomputation um einen __local-Parameter erweitert. Scheinbar erkennt er die Methode dann nicht mehr als die, die aufgerufen werden muss. Dummerweise habe ich daran auch bei meinem einfachen Einzeiler-Tet nicht gedacht.

:?: Was ich mich nun frage: warum geht das nicht? Wird das im OpenCL Programming Guide von nvidia (auf den Seiten 21-23) nicht auch gemacht? Muss ich da noch was im Host code anpassen, was mir mal wieder nicht auffällt?

ThorbenKo
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 7. Nov 2011 19:16

Re: Kernel wird scheinbar nicht ausgeführt?!

Beitrag von ThorbenKo » 29. Jan 2012 14:39

Hallo,

ich hab da mal eine Verständniss frage, und da es an sich zu diesem Code passt wollte ich kein Eigenes Thema auf machen:

Welche Daten werden in get_global_id(1) bzw get_global_id(0) gespeichert? Hab versucht viel ausgeben zu lassen aber irgendwie werde ich nicht schlau draus.

Wenn ich versuche den Oben gepostetn Code zu benutzen, kommt eine Speicherzugriffsverletzung.

Momentan Teste ich der einfacherhalber noch auf dem RGB rechnern, hoffe das liegt nicht dadran.

LG Thorben

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von mw1039 » 29. Jan 2012 14:43

ThorbenKo hat geschrieben:Welche Daten werden in get_global_id(1) bzw get_global_id(0) gespeichert?
http://d120.de/forum/viewtopic.php?f=180&t=24519

m2c1
Windoof-User
Windoof-User
Beiträge: 41
Registriert: 20. Dez 2010 10:39

Re: Kernel wird scheinbar nicht ausgeführt?!

Beitrag von m2c1 » 29. Jan 2012 14:48

ThorbenKo hat geschrieben:Wenn ich versuche den Oben gepostetn Code zu benutzen, kommt eine Speicherzugriffsverletzung.
Stimmt. Mit

Code: Alles auswählen

result[get_global_id(1) * numSequences + get_global_id(0)] = 0.0;
klappt es.

Bleibt nur noch die Frage mit dem __local.
Wenn ich eine __local Variable in der Methode deklariere (statt als Parameter der Funktion) funktioniert der weitere Code übrigens. Mein Fehler scheint also wirklich in diesem Bereich zu liegen... mmh

ThorbenKo
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 7. Nov 2011 19:16

Re: Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von ThorbenKo » 29. Jan 2012 15:50

result[get_global_id(1) * numSequences + get_global_id(0)] = 0.0;
Alle Einträge stetzt der aber auch nicht auf 0. Ich habs mal auf 1 gestetz und raus kommen 1-er bis
x=214 y=214: 1

und dann

x=0 y=215: 0

Mir ist nicht klar wo gesetz wird, wie oft diese Funktion auf gerufen wird.

Ich schrieb mal was ich denke, korrigiert mich wenn was falsch ist:

Es gibt 5*5=25 Threads pro Workgroup.

Und es gibt sequenceLength x sequenceLength Workgroups.
Also gibt es mit test.fata 1010*1010 Workgroups, also müsste jeder Wert gesetzt werden (um genau zu sein sogar 25 mal, da es 25 Threads pro Workgroup gibt)

VOn daher müsste der Code doch jede Zeile, sogar mehrfach, auf den Wert 1 setzen.

Wo ist mein Denkfehler?

^^

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von mw1039 » 29. Jan 2012 17:42

Das hilft vielleicht nicht unbedingt bei der Problemloesung, aber prueft ihr ueberhaupt, ob ihr evtl. ueber die Arraygrenzen hinausschreibt?
Z.B.

Code: Alles auswählen

int gid = get_global_id(1) * get_global_size(0) + get_global_id(0);
if(gid < numSequences * numSequences)
   result[gid] = 0;
oder so.

Dennis Albrecht
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 222
Registriert: 4. Okt 2010 18:15

Re: Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von Dennis Albrecht » 30. Jan 2012 00:07

Die global-ID ist, wie der Name schon vermuten lässt, global und global einmalig. Der "rechte untere" Prozess bekommt die "Position" 5050|5050 (5*1010). Du darfst daher nicht einfach auf die "ID-Adresse" schreiben (daher sollte auch der oben beschriebene Speicherzugriffsfehler kommen). Wenn das Programm so durchläuft ohne Fehlermeldung, dann achtet die GPU entweder nicht auf korrekte Speicherzugriffe (keine Ahnung, wie ordentlich die GPU arbeitet) oder ich würde mir ernsthaft Sorgen machen.
Wenn du die "richtige" Adresse brauchst hilft ein Modulo hier sehr. :D (Oder falls es sowas gibt, eine Workgroup-ID, meine Version kommt momentan noch ohne solchen Schnick-Schnack aus :D)

Gruß

studentabc
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 31. Okt 2011 13:56

Re: Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von studentabc » 30. Jan 2012 09:38

Wie ist es denn sonst möglich abhängig von der aktuellen Workgroup auf einen bestimmten Pixel zuzugreifen?

m2c1
Windoof-User
Windoof-User
Beiträge: 41
Registriert: 20. Dez 2010 10:39

Re: Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von m2c1 » 30. Jan 2012 20:06

Ohne modulo und mit global_id wird's doch auch in der 11. Übung gemacht?!

Hat vielleicht noch einer Idee, warum

Code: Alles auswählen

int i = get_global_id(1);
int j = get_global_id(0);
if( (i * numSequences + j) < (sequenceLength * numSequences) ) {
result[i * numSequences + j] = 0.1;
}
manchmal klappt (alle Werte korrekt auf 0.1 setzt), manchmal aber nur die ersten korrekt gesetzt werden und die übgrigen dabei auf den Werten einer alten Rechnung bleiben? Die ersten paar werden allerdings immer korrekt aktualisiert.

simon.r
Mausschubser
Mausschubser
Beiträge: 59
Registriert: 4. Okt 2010 16:13

Re: Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von simon.r » 30. Jan 2012 20:20

Die Ergebnismatrix hat sequenceLength^2 Einträge, außerdem glaube ich, dass i die x-Richtung in der Matrix und j die y-Richtung bezeichnet. Wenn du die Wahl der Workgroupsize und Globalsize nicht geändert hast und eine Workgroup einen Eintrag berechnen lassen willst, kannst du auch mit get_group_id i und j ermitteln.

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Kernel wird scheinbar nicht ausgeführt?! (__local)

Beitrag von mw1039 » 30. Jan 2012 20:45

m2c1 hat geschrieben:manchmal klappt (alle Werte korrekt auf 0.1 setzt), manchmal aber nur
Wenn sich das Verhalten bei unterschiedl. Ausfuehrungen unterscheidet, ist das ein Indiz dafuer, dass du irgendwie falsch (oder nicht) synchronisierst.

Antworten

Zurück zu „Archiv“