Я пишу код SSE к 2D свертке, но документация 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 - стена-o3-msse4.1-march=core2
Опции компоновщика
- lgomp - стена-o3-msse4.1-march=core2
У вас должна быть возможность использовать _MM_EXTRACT_FLOAT
.
Между прочим, мне кажется, что _mm_extract_ps
и _MM_EXTRACT_FLOAT
должны быть наоборот, то есть _mm_extract_ps
должен возвращать float, а _MM_EXTRACT_FLOAT
должен возвращать представление int, но что я знаю.