Ich habe den Artikel Optimierung der parallelen Reduktion in CUDA von Mark Harris gelesen, und ich fand es wirklich sehr nützlich, aber immer noch kann ich manchmal 1 oder 2 Konzepte nicht verstehen. Es steht geschrieben, auf S. 18:Parallel Reduction
//First add during load
// each thread loads one element from global to shared mem
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
sdata[tid] = g_idata[i];
__syncthreads();
optimierte Code: Mit 2 Lasten und ersten Zusatz der Reduktion:
// perform first level of reduction,
// reading from global memory, writing to shared memory
unsigned int tid = threadIdx.x; ...1
unsigned int i = blockIdx.x*(blockDim.x*2) + threadIdx.x; ...2
sdata[tid] = g_idata[i] + g_idata[i+blockDim.x]; ...3
__syncthreads(); ...4
vermögen mich nicht zu verstehen, Linie 2; Wenn ich 256 Elemente habe und 128 als meine Blockgröße wähle, warum multipliziere ich dann mit 2? Bitte erläutern, wie man die Blockgröße ermittelt?
Danke für Ihre Antwort. Ich versuche die Lösung zu verstehen, aber wenn Sie mir mitteilen können, wie viele Elemente es insgesamt gibt, und wie viele Elemente werden pro Block bearbeitet? Auch wenn Sie mich wissen lassen können, haben wir zunächst Elemente mit 4 Blöcken und jetzt die gleiche Anzahl von Elementen, aber mit 2 Blöcken bearbeitet? – robot
: H Warum berechnet jeder Thread nur 2 Elemente? Da es insgesamt 16 Elemente und 4 Threads/Blöcke gibt, berechnen 2 Threads jedes Blocks 4 Elemente. – robot
Danke für die Antwort. Wenn jeder Thread der ersten 2 Blöcke 2 Elemente berechnet, was wird dann jeder Thread für die letzten 2 Blöcke tun? – robot