Я ищу наиболее эффективный метод переворота знака на всех четырех поплавках, упакованных в регистр SSE.
Я не нашел встроенной функции для этого в руководстве по разработке программного обеспечения для архитектуры Intel. Ниже приведены вещи, которые я уже пробовал.
Для каждого случая я перебрал код 10 миллиардов раз и получил указанное время стены. Я пытаюсь, по крайней мере, сопоставить 4 секунды, это требует моего подхода, отличного от SIMD, который использует только унарный оператор минус.
[48 сек.]_mm_sub_ps( _mm_setzero_ps(), vec );
[32 сек.]_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );
[9 сек]
union NegativeMask { int intRep; float fltRep; } negMask; negMask.intRep = 0x80000000; _mm_xor_ps( _mm_set1_ps( negMask.fltRep ), vec );
Компилятор gcc 4.2 с -O3. Процессор — Intel Core 2 Duo.