CUDA Academy · Урок

Наивное ядро умножения матриц

Базовый вариант с двумерной индексацией и его ограничения.

Урок 1 из 413 шагов

«Наивное ядро умножения матриц» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Наивное ядро умножения матриц
  2. Разбиение скалярного произведения на фрагменты
  3. Цикл по этапам обработки фрагментов
  4. Измерение ускорения
← Назад к CUDA Academy