_mm_hadd_ps не был объявлен в этой области

Я нахожусь в процессе оптимизации моего кода для умножения матриц.

for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
float tmp = 0;
for (int k = 0; k < SIZE; k+=4) {
v1 = _mm_load_ps(&m1[i][k]);
v2 = _mm_load_ps(&m2[j][k]);
vMul = _mm_mul_ps(v1, v2);

vRes = _mm_add_ps(vRes, vMul);
}
vRes = _mm_hadd_ps(vRes, vRes);
vRes = _mm_hadd_ps(vRes, vRes);
_mm_store_ss(&result[i][j], vRes);
}
}

Но g++ жалуется, что «* ‘_ mm_hadd_ps’ не был объявлен в этой области *». Почему это так, я могу использовать другие функции SSE, такие как _mm_add_ps

3

Решение

использование #include <x86intrin.h>, он будет включать все встроенные функции, поддерживаемые целевым процессором. В том числе pmmintrin.h и так не рекомендуется и не рекомендуется в последних версиях GCC. Также убедитесь, что вы нацелены на набор инструкций SSE3 в вашей компиляции, либо добавив -msse3 вариант или (лучше) с помощью -march= вариант.

4

Другие решения

Горизонтальные инструкции по добавлению (такие как _mm_hadd_ps) являются частью SSE3. Все остальные, которые вы используете в настоящее время, являются SSE.

Кажется, вы включили только заголовки SSE или SSE2.

Так что вам понадобится заголовок SSE3:

#include <pmmintrin.h>

Это позволит:

  • _mm_addsub_ps
  • _mm_addsub_pd
  • _mm_hadd_ps
  • _mm_hadd_pd
  • _mm_hsub_ps
  • _mm_hsub_pd
  • _mm_movehdup_ps
  • _mm_movehdup_pd
  • _mm_moveldup_ps
  • _mm_moveldup_pd
  • _mm_lddqu_si128
7

В дополнение к включению правильного заголовка, как указал Mysticial, вам также может понадобиться добавить -msse3 флаг для g++Аргументы командной строки для включения инструкций SSE3. Это позволит генератору кода выдавать инструкции SSE3 и определит __SSE3__ макрос препроцессора, который затем включает объявления в <pmmintrin.h>,

3
По вопросам рекламы [email protected]