Оптимизация скалярного произведения
Векторизуйте и разворачивайте скалярное произведение.
«Оптимизация скалярного произведения» — бесплатный урок Mojo Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Mojo Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Mojo Academy содержит 4 уроков всего.
Основа скалярного произведения
Скалярное произведение перемножает два набора поэлементно и складывает результаты. Его ускорение ускоряет весь matmul.
var acc: Float32 = 0.0
for k in range(K):
acc += a[k] * b[k]Обработка одной полосы за раз медленная
Обычный цикл обрабатывает одну пару за шаг. Современные CPU могут обрабатывать много пар одновременно, поэтому скалярный код оставляет полосы без работы.
Знакомьтесь: SIMD
Значение SIMD упаковывает несколько чисел и применяет одну операцию ко всем сразу, выполняя настоящую параллельную работу за одну инструкцию.
var v = SIMD[DType.float32, 4](1, 2, 3, 4)Загружайте фрагмент целиком
Вместо одного числа с плавающей точкой загрузите одним перемещением целый фрагмент каждого массива шириной SIMD, подготовленный для векторных вычислений.
var va = a.load[width=4](k)
var vb = b.load[width=4](k)Перемножайте целые векторы
Перемножение двух значений SIMD за один шаг создаёт вектор произведений. Поэлементная обработка выполняется одновременно во всех полосах.
var prod = va * vb # 4 products at onceНакапливайте вектор
Храните SIMD-накопитель и добавляйте в него каждый вектор произведений. Финальную сумму Вы вычислите после завершения цикла.
var acc = SIMD[DType.float32, 4](0)
acc += va * vbДелайте шаг, равный ширине
Теперь цикл продвигается на величину SIMD-ширины, а не на единицу. При ширине в четыре полосы итераций требуется в четыре раза меньше.
for k in range(0, K, 4):
acc += a.load[width=4](k) * b.load[width=4](k)Выполняйте свёртку в конце
После цикла объедините накопленные в полосах значения в одно число с помощью горизонтальной свёртки, получив итоговое скалярное произведение.
var total = acc.reduce_add()Разворачивайте цикл
Разворачивание обрабатывает несколько блоков за одну итерацию, сокращая накладные расходы цикла и предоставляя CPU больше независимой работы.
Обрабатывайте остаток
Если K не кратно ширине, несколько элементов останутся необработанными. Небольшой цикл для хвоста завершит их по одному.
for k in range(K - K % 4, K):
total += a[k] * b[k]Позвольте Mojo помочь
Mojo предоставляет вспомогательную функцию vectorize, которая применяет тело с заданной шириной к диапазону, самостоятельно обрабатывая шаги и хвост.
Быстрая проверка
Зачем после цикла скалярного произведения с шириной SIMD вызывать reduce_add?
Повторение
Векторизуйте скалярное произведение: загружайте фрагменты SIMD, перемножайте полосы, накапливайте результаты, а затем выполняйте свёртку; разворачивайте цикл и обрабатывайте хвост. ⚡
Изучай Mojo с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Оптимизация скалярного произведения» бесплатный?
Да — полный текст урока «Оптимизация скалярного произведения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Mojo Academy, подпишись на CoddyKit PRO. Курс Mojo Academy содержит 4 уроков всего.
Чему я научусь в уроке «Оптимизация скалярного произведения»?
Векторизуйте и разворачивайте скалярное произведение. Ты практикуешь Mojo Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Mojo Academy?
Предыдущий опыт не требуется. Mojo Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Оптимизация скалярного произведения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Mojo Academy?
Да. Каждый урок Mojo Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Моделирование тензора в Mojo
- Пошаговое создание Matmul
- Оптимизация скалярного произведения
- Проверка числовой корректности