Я нахожусь в процессе оптимизации моего кода для умножения матриц.
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
…
использование #include <x86intrin.h>
, он будет включать все встроенные функции, поддерживаемые целевым процессором. В том числе pmmintrin.h
и так не рекомендуется и не рекомендуется в последних версиях GCC. Также убедитесь, что вы нацелены на набор инструкций SSE3 в вашей компиляции, либо добавив -msse3
вариант или (лучше) с помощью -march=
вариант.
Горизонтальные инструкции по добавлению (такие как _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
В дополнение к включению правильного заголовка, как указал Mysticial, вам также может понадобиться добавить -msse3
флаг для g++
Аргументы командной строки для включения инструкций SSE3. Это позволит генератору кода выдавать инструкции SSE3 и определит __SSE3__
макрос препроцессора, который затем включает объявления в <pmmintrin.h>
,