Я пишу код SSE для двумерной свертки, но документация по SSE очень скудна. Я вычисляю скалярное произведение с помощью _mm_dp_ps и использую _mm_extract_ps для получения результата скалярного произведения, но _mm_extract_ps возвращает шестнадцатеричное значение, которое представляет собой число с плавающей запятой, и я не могу понять, как преобразовать это шестнадцатеричное число с плавающей запятой в обычное число с плавающей запятой. Я мог бы использовать __builtin_ia32_vec_ext_v4sf, который возвращает число с плавающей запятой, но я хочу сохранить совместимость с другими компиляторами.
_mm_extract_ps (__m128 __X, const int __N)
{
union { int i; float f; } __tmp;
__tmp.f = __builtin_ia32_vec_ext_v4sf ((__v4sf)__X, __N);
return __tmp.i;
}
Какой момент мне не хватает?
Небольшая помощь будет оценена, спасибо.
OpenSUSE 11.2
GCC 4.4.1
C ++
Параметры компилятора
-fopenmp -Wall -O3 -msse4.1 -march = core2
Параметры компоновщика
- lgomp -Wall -O3 -msse4.1 -march = core2