Matrix Matrix im Host/Device Speicher Verteilung der

Matrix
Matrix der Größe nx × ny:
1
2
A = ..
.
ny
1
a11
a21
..
.
2
a12
a22
..
.
...
...
...
..
.
nx
a1 nx
a1 nx
..
.
any 1
any 2
...
any nx










Matrix im Host/Device Speicher
Nach allozieren/reservieren des linearen Speichers:
int nxy = nx * ny;
int nBytes = nxy * sizeof(float);
float *h_A;
h_A = (float *)malloc(nBytes);
identifizieren wir (“row-major order” bzw. zeilenweise Anordnung):
h_A[0]= a11
h_A[1]= a12
..
.
h_A[nx-1]= a1 nx
h_A[nx]= a21
h_A[nx+1]= a22
..
.
h_A[iy*nx+ix]= aiy+1 ix+1
..
.
h_A[nxy-1]= any nx
Für die anderen Speicherbereiche im Host- (h_B, hostRef, gpuRefh_B, hostRef, gpuRef) und
im Device-Speicher (d_MatA, d_MatB, d_MatC) erfolgt die Zuordnung equivalent.
Verteilung der Matrixelemente auf Threads
Spaltenweise Verteilung
Für ein 1-dimesnionales Grid mit 1-dimesnionalen Thread-Blöcken und der Notation
nb = blockDim.x
ng = gridDim.x
ib = blockIdx.x
1
ith = threadIdx.x
ergibt sich folgende Verteilung der Matrixelemente auf Threads mit den Koordinaten (ib, ith):
1
2
...
1
(0, 1) (0, 2) . . .
2 
 (0, 1) (0, 2) . . .
A= .  .
..
..
..  ..
.
.
ny (0, 1) (0, 2) . . .

nb − 1
(0, nb − 1)
(0, nb − 1)
..
.
nb
...
(1, 0) . . .
(1, 0) . . .
..
..
.
.
(0, nb − 1) (1, 0) . . .
nx

(ng − 1, nb − 1)
(ng − 1, nb − 1) 


..

.
(ng − 1, nb − 1)
D.h., jeder Thread bearbeitet eine Spalte der Matrix. Dies ist die Verteilung im Beispielprogramm
sumMatrixOnGPU-1D-grid-1D-block.cu.
2