Наивное ядро умножения матриц
Базовый вариант с двумерной индексацией и его ограничения.
«Наивное ядро умножения матриц» — бесплатный урок CUDA Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения CUDA Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс CUDA Academy содержит 4 уроков всего.
Умножение матриц в стиле GPU
Умножение матриц лежит в основе графики и искусственного интеллекта. Сегодня вы сначала создадите наивную версию для GPU, а затем узнаете, почему она работает не на пределе скорости.
Математика в одной строке
Каждая выходная ячейка C[row][col] — это скалярное произведение: полная строка A умножается на полный столбец B, а результаты суммируются. 🧮
C[row][col] = sum over k of A[row][k] * B[k][col]Один поток на один результат
В самом простом плане каждому потоку назначается один выходной элемент C. Тысячи ячеек вычисляются одновременно на всём GPU.
Двумерная сетка потоков
Поскольку C — двумерная сетка, потоки запускаются в двух измерениях. Индекс x соответствует столбцу, а индекс y — строке.
dim3 threads(16, 16);
dim3 blocks((N+15)/16, (N+15)/16);Поиск ячейки этого потока
Внутри ядра каждый поток вычисляет собственные строку и столбец по индексам блока и потока, как при одномерной индексации, но по обеим осям.
int row = blockIdx.y*blockDim.y + threadIdx.y;
int col = blockIdx.x*blockDim.x + threadIdx.x;Проверка границ
Сетки округляются вверх, поэтому некоторые потоки выходят за пределы матрицы. Перед обращением к памяти используйте проверку if (row < N && col < N).
if (row < N && col < N) {
// safe to compute
}Внутренний цикл
Каждый поток выполняет цикл по k, накапливая произведения в локальной сумме. Эта локальная переменная хранится в быстром регистре.
float sum = 0.0f;
for (int k = 0; k < N; ++k)
sum += A[row*N+k] * B[k*N+col];Запись результата
После завершения цикла поток ровно один раз сохраняет накопленную сумму в C. Один поток — одна аккуратная запись.
C[row*N + col] = sum;Преобразование в строковый порядок
Матрица представляет собой плоский одномерный массив, поэтому индекс вычисляется как row*N + col. Правильно организовать это представление — половина успеха в умножении матриц.
Почему это работает, но медленно
Это ядро правильное и легко читается, но каждый поток напрямую считывает свою строку и столбец из глобальной памяти, самого медленного пространства.
Скрытая цена
Соседние потоки снова и снова перечитывают одни и те же строки A и столбцы B. Именно этот напрасный обмен данными с памятью следующим шагом устранит тайлинг.
Быстрая проверка
Подумайте, как наивное ядро распределяет работу между потоками.
Итоги
Вы сопоставили один поток с одной выходной ячейкой, выполнили цикл по k, считывая данные из глобальной памяти, и увидели повторные чтения. Далее вы сократите этот обмен с помощью тайлинга. 🚀
Изучай C++ с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Наивное ядро умножения матриц» бесплатный?
Да — полный текст урока «Наивное ядро умножения матриц» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс CUDA Academy, подпишись на CoddyKit PRO. Курс CUDA Academy содержит 4 уроков всего.
Чему я научусь в уроке «Наивное ядро умножения матриц»?
Базовый вариант с двумерной индексацией и его ограничения. Ты практикуешь CUDA Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать CUDA Academy?
Предыдущий опыт не требуется. CUDA Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Наивное ядро умножения матриц»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке CUDA Academy?
Да. Каждый урок CUDA Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Наивное ядро умножения матриц
- Разбиение скалярного произведения на фрагменты
- Цикл по этапам обработки фрагментов
- Измерение ускорения