get_local_id vs. get_global_id

jojo1704
DON'T PANIC
Beiträge: 42
Registriert: 12. Apr 2011 11:18

get_local_id vs. get_global_id

Beitrag von jojo1704 » 24. Jan 2012 12:33

Wo liegt denn der Unterschied zwischen get_local_id und get_global_id?

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

Re: get_local_id vs. get_global_id

Beitrag von Dennis Albrecht » 24. Jan 2012 15:36

get_local_id gibt dir keine "Koordinate" bezogen auf die Workgroup, get_global_id bezogen auf alle Threads.
aus der lokalen id kannst du zum Beispiel ableiten, wer wann welche Daten faltet,
aus der globalen id leitet sich ab, welches Feld der Ergebnismatrix du berechnest.

Gruß

Markus1189
Erstie
Erstie
Beiträge: 22
Registriert: 12. Apr 2011 21:14

Re: get_local_id vs. get_global_id

Beitrag von Markus1189 » 25. Jan 2012 10:13

Zu local_id vs global_id hätte ich auch noch eine Frage:

So wie ich das bis jetzt verstanden habe, ist im vorgegebenen Coderahmen die local_worksize = [5,5] und die global_worksize [seqLength*5,seqLength*5].

Jetzt hatte ich das so interpretiert, dass durch die global_work_size Workgroups für unsere Ergebnismatrix aufgeteilt werden und pro Eintrag 5x5 Threads arbeiten.

Wenn ich jetzt aber per printf get_global_id(0) und get_global_id(1) aufrufe, dann gehen die indices bei einer Sequenzlänge von 4 bis 20, da die global_worksize 20x20 ist.

Wie genau soll man denn die Arbeit aufteilen bzw. wie kommt man denn an die richtigen x,y Werte um auf MSA Matrix zuzugreifen und gleichzeitig wieder an die richtige Stelle der Ergebnis-Matrix zu schreiben?

Und warum funktioniert folgendes nicht:

Code: Alles auswählen

 __local char col1[sequenceLength];

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

Re: get_local_id vs. get_global_id

Beitrag von simon.r » 25. Jan 2012 10:41

In OpenCL können nur Array angelegt werden, deren Größe zur Compilezeit bekannt sind (deswegen sind im oberen Teil des Kernels bereits einige Konstanten definiert). Ich habe die Aufgabenstellung so verstanden, dass wir die global work size und workgroup size entsprechend an unseren Kernel anpassen sollen - wobei ich nicht weiß, ob die Werte für alle möglichen Eingaben oder nur test.fasta gelten sollen.

oliver_g
Mausschubser
Mausschubser
Beiträge: 62
Registriert: 17. Nov 2008 16:27

Re: get_local_id vs. get_global_id

Beitrag von oliver_g » 25. Jan 2012 11:34

Nochmal zum Verständnis:
get_group_id(i) liefert die ID der aktuellen work group in der Dimension i
get_local_id(i) liefert die ID des aktuellen Threads in der Dimension i
get_global_id(i) liefert die ID des aktuellen Threads bezüglich auf alle anderen Threads

local_work_size = { 5, 5 } gibt an, dass in jeder work group je 5 Threads in zwei Dimensionen sein sollen, insgesamt also 25.
global_work_size = {sequenceLength * 5, sequenceLength * 5 } gibt an, dass es insgesamt 5 * sequenceLength Threads in jeder Dimension geben soll, also alles in allem (5 * sequenceLength) ^ 2 Threads.
Daraus folgt also, dass es sequenceLength x sequenceLength work groups gibt.

Die local_work_size und die global_work_size ist immer abhängig von eurem Kernel und wie ihr definiert welcher Thread welche Arbeit zu tun hat.

Euer Kernel muss mit test.fasta umgehen können, die Werte für die Größen können aber leicht so gewählt werden, dass sie unabhängig von einem bestimmten Sequenzfile sind.

Markus1189
Erstie
Erstie
Beiträge: 22
Registriert: 12. Apr 2011 21:14

Re: get_local_id vs. get_global_id

Beitrag von Markus1189 » 25. Jan 2012 18:37

Okay, dankeschön oliver_g das klärt einige meiner Probleme :)

Antworten

Zurück zu „Archiv“