Lección 26: Multiplicación de matrices — el kernel ingenuo de GPU
La multiplicación de matrices C = A * B calcula cada elemento C[row][col] como una suma de productos a lo largo de la dimensión compartida K: C[row][col] = suma sobre k de A[row][k] * B[k][col]. La forma directa (ingenua) de paralelizar esto en una GPU es asignar un hilo a cada elemento de C: el hil
Imagina una enorme cuadrícula de multiplicación que hay que llenar. En la versión ingenua, cada trabajador es responsable de una sola celda, pero para llenarla camina hasta un depósito lejano y trae toda una fila y toda una columna — y el trabajador de al lado camina hasta el mismo depósito y trae exactamente la misma fila de nuevo. Muchos viajes desperdiciados.
- mapeo de hilo a elemento
- Cada hilo es dueño de un elemento de C. Calcula row y col a partir de los índices 2D y produce C[row][col].
- el bucle k (producto punto)
- El bucle sobre k que acumula sum += A[row*K + k] * B[k*N + col]. Es un producto punto de una fila de A con una columna de B.
- índice plano row-major
- Una matriz de rows x cols se guarda fila tras fila, así que el elemento [r][c] está en la dirección r*cols + c.
- lecturas globales redundantes
- En la versión ingenua, cada elemento de A y de B se lee de la memoria global una y otra vez por distintos hilos, quemando ancho de banda.