Hardsimd

Что такое SIMD и vectorization?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

SIMD (Single Instruction Multiple Data) — одна инструкция обрабатывает несколько данных параллельно. SSE (128 бит = 4 float), AVX (256 бит = 8 float), AVX-512 (512 бит).

// Скалярный цикл
for (int i = 0; i < N; ++i)
    c[i] = a[i] + b[i];

// Компилятор с -O3 -march=native может его авто-векторизовать.
// Ручная SIMD-версия через intrinsic:
void add4(const float* a, const float* b, float* c) {
    __m128 va = _mm_load_ps(a);
    __m128 vb = _mm_load_ps(b);
    __m128 vc = _mm_add_ps(va, vb);
    _mm_store_ps(c, vc);   // 4 float за раз
}

Ограничения для авто-векторизации: данные aligned, нет зависимостей между итерациями, минимум ветвлений. Ручная SIMD даёт 2–16x ускорение в обработке изображений, аудио, ML.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.