SIMD (Single Instruction, Multiple Data) — это принцип параллельной обработки данных, при котором одна инструкция применяется одновременно к нескольким элементам данных. В контексте C/C++ это реализуется через специальные наборы инструкций процессора (MMX, SSE, AVX, NEON и др.), позволяющие выполнять операции над векторами данных за один такт.
Пример:
// Пример использования SSE для сложения 4 float чисел одновременно
#include <xmmintrin.h>
void add_arrays(float* a, float* b, float* result, int size) {
for (int i = 0; i < size; i += 4) {
__m128 vec_a = _mm_load_ps(&a[i]); // Загрузка 4 float
__m128 vec_b = _mm_load_ps(&b[i]);
__m128 vec_result = _mm_add_ps(vec_a, vec_b); // Сложение 4 float
_mm_store_ps(&result[i], vec_result); // Сохранение результата
}
}
#include <immintrin.h>
__m256i vec = _mm256_loadu_si256((__m256i*)ptr);
// Компилятор может автоматически векторизовать этот цикл
for (int i = 0; i < N; i++) {
c[i] = a[i] + b[i];
}
Библиотеки:
Языковые расширения:
// Использование расширения GCC для векторных типов
typedef float v4sf __attribute__((vector_size(16)));
v4sf a = {1.0f, 2.0f, 3.0f, 4.0f};
v4sf b = a + a; // Поэлементное сложение
Резюмируем: SIMD — мощный инструмент оптимизации, требующий понимания архитектуры процессора и правил работы с векторизованными операциями. При грамотном использовании может дать ускорение в 4-8 раз для подходящих задач.