2016-03-29 11 views
1

Also habe ich eine parallele Reduktion Summe auf der GPU im globalen Speicher geschrieben, weil meine GPU keinen gemeinsamen Speicher hat (ich glaube, das bedeutet, dass ich lokalen Speicher nicht verwenden kann?). Problem ist, wenn ich versuche, mehr als 1024 * 4 Anzahl von Zahlen hinzuzufügen, beginnt es, die falsche Lösung auszugeben, normalerweise ist es um ein paar hundert bis ein paar tausend abhängig davon, wie viele Zahlen ich eingib. Was könnte der Grund sein? A ist der Eingang, C ist der Ausgang.Parallele Reduktion Summe auf GPU berechnet falsch opencl

__kernel void GMM(__global float *A, __global float *B, __global float *C) 
{ 
uint global_id =get_global_id(0); 
uint group_size=get_global_size(0); 

B[global_id]=A[global_id]; 
for(int stride = group_size/2;stride>0;stride /=2) 
{ 
    if(global_id<stride) 
    { 
     B[global_id]+=B[global_id+stride]; 
    } 
} 
if(global_id == 0) 
C[get_group_id(0)]=B[0]; 
} 
+0

Wie viele Arbeitsgruppen planen Sie und wie groß ist die Arbeitsgruppe? – doqtor

+0

Ich habe eine globale Größe von 1024 * 4 und eine lokale Größe von 2 so 2048 Arbeitsgruppen. – Fluffy

+0

Ich vermute, dass ich eine Art von Cap eingeben werde und zufällige globale Werte hinzufüge, die bereits hinzugefügt wurden, wenn ich die globale Größe von 1024 * 4 überschreite? – Fluffy

Antwort

0

löste es anscheinend habe ich geteilten Speicher. Und durch die Verwendung von lokalem Speicher und lokalen Barrieren sind die Lösungen konsistent und korrekt!

Verwandte Themen