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
© Copyright 2024 ExpyDoc