Lesen/Schreiben auf lokalem Memory

nt4u
Mausschubser
Mausschubser
Beiträge: 50
Registriert: 16. Apr 2009 15:02

Lesen/Schreiben auf lokalem Memory

Beitrag von nt4u » 4. Feb 2012 09:17

Hi,

ich komme nicht zurecht mit der Berechnung der p_i_j (=twoPointOccs). Wenn ich das parallelisieren will:
* darf ich dann in mehreren Threads auf eine lokale Variable schreiben?
* ... von einer Variable lesen?
* wenn beides nein, wie zählt man die Buchstabenpärchen? Man hat doch die 2 Spalten der Sequenzen auf die jeder Thread zugreifen müsste... Und dann hat man eventuell noch einen Zähler für jede Buchstabenkombination, da kann es, je nach implementierung passieren, dass gleichzeitig geschrieben (um 1 erhöht) wird.

Ich bin etwas ratlos.

Lucas-
Neuling
Neuling
Beiträge: 7
Registriert: 26. Jan 2012 23:53

Re: Lesen/Schreiben auf lokalem Memory

Beitrag von Lucas- » 4. Feb 2012 13:47

Lesen: Ja
Lesen UND Schreiben : Nein

Dann brauchst du sowas hier: http://www.cmsoft.com.br/index.php?opti ... Itemid=168

bttf
Mausschubser
Mausschubser
Beiträge: 76
Registriert: 9. Nov 2011 14:04

Re: Lesen/Schreiben auf lokalem Memory

Beitrag von bttf » 4. Feb 2012 14:27

Vor diesem Problem stand ich zunächst auch. Hatte es erst mit dem ++ Operator versucht, aber wenn mehrere Threads parallel damit versuchen einen Eintrag in den twoPointOccs zu erhöhen, ist das Ergebnis immer 1, weil ja alle gleichzeitig um 1 erhöhen. Lösung des Problems ist die atom_inc Funktion. Wenn z.B. 3 Threads parallel atom_inc(twoPointOccs[0][0]); aufrufen, ist danach auch wie gewünscht twoPointOccs[0][0] = 3. Um atom_inc auf dem Cluster nutzen zu können, muss man nur die Zeile

Code: Alles auswählen

#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
bzw.

Code: Alles auswählen

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
hinzufügen, je nach dem, ob man die twoPointOccs im lokalen oder im globalen Speicher hat.

mfg

nt4u
Mausschubser
Mausschubser
Beiträge: 50
Registriert: 16. Apr 2009 15:02

Re: Lesen/Schreiben auf lokalem Memory

Beitrag von nt4u » 4. Feb 2012 14:55

Das klingt nach etwas, was ich brauchen könnte. In welcher Datei muss man das "#pragma..." hinzufügen? Habe es eben im Kernel selbst probiert (oben, bei den #define sowie innerhalb des Codes vor der Schleife) und ein Aufruf von atom_inc(twoPointOccs[0][0]); innerhalb einer Schleife bringt mir einen CL_BUILD_PROGRAM_FAILURE. Wie ist denn deine twoPointOccs definiert? Bei mir "__local int twoPointOccs[NUMCHARS][NUMCHARS];".

bttf
Mausschubser
Mausschubser
Beiträge: 76
Registriert: 9. Nov 2011 14:04

Re: Lesen/Schreiben auf lokalem Memory

Beitrag von bttf » 4. Feb 2012 15:02

Hmm, hast du auch diese Zeile hier übernommen? (die mit dem local, da dein twoPointOccs ja local ist)

Code: Alles auswählen

    #pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
Im Kernel oben bei den #define.... ist schon richtig. Aber nur da!

twoPointOccs ist bei mir genauso definiert. atom_inc(twoPointOccs[0][0]); sollte eigentlich funktionieren.

Typeholic
Neuling
Neuling
Beiträge: 7
Registriert: 18. Okt 2011 17:48

Re: Lesen/Schreiben auf lokalem Memory

Beitrag von Typeholic » 4. Feb 2012 18:36

Die Syntax vom Befehl lautet: atom_inc(Q T *p) also solltest du deine twoPointOccs als Referenz übergeben sprich so: atom_inc(&twoPointOccs[x][y]);

Das sollte dann in Verbindung mit den oben erwähnten #pragma funktionieren

bttf
Mausschubser
Mausschubser
Beiträge: 76
Registriert: 9. Nov 2011 14:04

Re: Lesen/Schreiben auf lokalem Memory

Beitrag von bttf » 4. Feb 2012 19:38

Ups vergessen.... ja ohne das & funktionierts nicht :mrgreen:

Antworten

Zurück zu „Archiv“