Самый быстрый способ сделать горизонтальную векторную сумму с помощью инструкций AVX [дубликат]

На этот вопрос уже есть ответ здесь:

Получить сумму значений, хранящихся в __m256d с помощью SSE / AVX 2 ответа

У меня есть упакованный вектор из четырех 64-битных значений с плавающей точкой.
Я хотел бы получить сумму элементов вектора.

С SSE (и используя 32-битные числа с плавающей запятой) я мог бы просто сделать следующее:

v_sum = _mm_hadd_ps(v_sum, v_sum);
v_sum = _mm_hadd_ps(v_sum, v_sum);

К сожалению, несмотря на то, что AVX содержит инструкцию _mm256_hadd_pd, результат отличается от версии SSE. Я полагаю, что это связано с тем, что большинство инструкций AVX работают как инструкции SSE для каждого младшего и старшего 128-битного отдельно, не пересекая 128-битную границу.

В идеале решение, которое я ищу, должно соответствовать следующим правилам:
1) Используйте только инструкции AVX / AVX2. (нет SSE)
2) сделать это не более чем за 2-3 инструкции.

Тем не менее, любой эффективный / элегантный способ сделать это (даже без соблюдения вышеуказанных рекомендаций) всегда хорошо принят.

Большое спасибо за любую помощь.

Луиджи Кастелли

Ответы на вопрос(3)

Ваш ответ на вопрос