Эффективные методы реализации моделей ИИ
Векторный модуль (VU) поверх FPU-ядра
Один элемент за раз
Скалярная инструкция обрабатывает один элемент за такт.
64 элемента → 256 тактов в цикле.
VL элементов за команду
Векторная инструкция обрабатывает VL элементов за одну команду.
64 элемента → 4 такта (16 байт / такт).
$$S = \frac{1}{(1 - p) + \dfrac{p}{n}}$$
Предел ускорения
Ускорение ограничено долей кода, которую нельзя распараллелить.
\(p\) — доля параллелизуемого кода, \(n\) — число параллельных юнитов.
4 задания
Сумма массива
\(\sum_{i} x_i\)
Массив из 10 чисел (UINT8). Посчитайте сумму используя векторные инструкции. Результат запишите в регистр A.
Скалярное произведение
\(\mathbf{a} \cdot \mathbf{b} = \sum_{i} a_i b_i\)
Два вектора длины 5 (UINT8). Вычислите скалярное произведение с помощью векторных инструкций. Результат запишите в регистр A.
Матрица × вектор
\(\mathbf{y} = W\mathbf{x}\)
Матрица W [2,3] и вектор x [3] в формате OFP8 E4M3. Реализуйте умножение матрицы на вектор с помощью векторных инструкций. Результат (float16) запишите в res.
Softmax
$$\text{softmax}(x_i) = \frac{e^{x_i - \max}}{\sum_j e^{x_j - \max}}$$
Вектор logits в формате float16. Вычислите softmax с помощью векторных инструкций. Вычитание max стабилизирует экспоненту. Результат запишите в res.