Урок 27: Тайловое умножение матриц
Умножение матриц C = A * B вычисляет каждый элемент C[row][col] как сумму произведений вдоль измерения K: C[row][col] = сумма по k от A[row][k] * B[k][col]. В наивной версии каждый поток, отвечающий за один элемент C, читает целую строку A и целый столбец B напрямую из глобальной памяти — самого мед
Представьте, что вы готовите блюдо и раз за разом бегаете на далёкий склад за одними и теми же ингредиентами. Вместо этого вы один раз приносите целый ящик на кухонный стол (ближайшую полку), и все повара быстро берут из него. Тайлинг — это именно то же самое: вы один раз приносите тайл данных в ближайшую разделяемую память и снова и снова используете его там.
- тайловое умножение матриц (tiled matmul)
- Алгоритм умножения матриц, который загружает тайлы A и B в разделяемую память, синхронизируется и накапливает результат оттуда — экономя чтения из глобальной памяти.
- тайл
- Подблок матрицы размером TILE x TILE, загружаемый сразу в разделяемую память и используемый всеми потоками блока.
- повторное использование разделяемой памяти
- Каждый элемент, загруженный в разделяемую память, читается TILE различными потоками, поэтому одно глобальное чтение обслуживает много произведений.
- измерение K
- Общее измерение в произведении: A имеет размер M x K, а B — K x N. Сумма по k идёт вдоль K и вычисляется тайл за тайлом.