В принципе ускорение может быть в 4 раза с SSE (8 раз с AVX). Позвольте мне объяснить.
Давайте назовем вашу фиксированную матрицу 5x5 M . Определение компонентов 5D вектора как (x, y, z, w, t). Теперь сформируйте матрицу 5x4 U из первых четырех векторов.
U =
xxxx
yyyy
zzzz
wwww
tttt
Далее делаем матричное произведение MU = V . Матрица V содержит произведение M и первые четыре вектора. Единственная проблема заключается в том, что для SSE нам нужно читать в строках U , но в памяти U хранится как xyzwtxyzwtxyzwtxyzwt , поэтому мы должны транспонировать его в xxxxyyyyzzzzwwwwtttt . Это можно сделать с помощью перемешивания / смешивания в SSE. Как только мы получим этот формат, матричный продукт будет очень эффективным.
Вместо операций O (5x5x4) со скалярным кодом, требуется только O (5x5) операций, то есть ускорение в 4 раза. С AVX матрица U будет иметь размер 5x8, поэтому вместо операций O (5x5x8) она облагает налогом только O (5x5), то есть ускорение в 8 раз.
Матрица V , однако, будет иметь формат xxxxyyyyzzzzwwwwtttt , поэтому в зависимости от приложения ее, возможно, придется преобразовать в формат xyzwtxyzwtxyzwtxyzwt .
Повторите это для следующих четырех векторов (8 для AVX) и т. Д., Пока не будет сделано.
Если у вас есть контроль над векторами, например, если ваше приложение генерирует векторы на лету, вы можете генерировать их в формате xxxxyyyyzzzzwwwwtttt и избегать транспонирования массива. В этом случае вы должны получить 4-кратную скорость с SSE и 8-кратную с AVX. Если вы объедините это с многопоточностью, например, OpenMP, ваше ускорение должно быть близко к 16x (при условии четырех физических ядер) с SSE. Я думаю, что это лучшее, что вы можете сделать с SSE.
Редактировать: Из-за параллелизма на уровне команд (ILP) вы можете получить еще один коэффициент ускорения, равный 2, так что ускорение для SSE может увеличиться в 32 раза с четырьмя ядрами (64x AVX) и снова еще раз с 2 с Haswell из-за FMA3.