Переворачивающий знак на упакованных поплавках SSE

Я ищу наиболее эффективный метод переворота знака на всех четырех поплавках, упакованных в регистр 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.


person nsanders    schedule 29.07.2010    source источник


Ответы (3)


Просто чтобы завершить свой собственный ответ документацией gcc об этих встроенных векторах:

The types defined in this manner can be used with a subset of normal C
operations.  Currently, GCC will allow using the following operators on
these types: `+, -, *, /, unary minus, ^, |, &, ~'.

Вероятно, будет хорошей идеей всегда придерживаться их, когда это возможно. С очень высокой вероятностью gcc всегда будет предоставлять наиболее эффективный код для этого материала SSE.

Для параметров вашего компилятора добавьте что-то более конкретное для вашей архитектуры, в большинстве случаев подойдет что-то вроде -march=native.

person Jens Gustedt    schedule 29.07.2010

Этот союз на самом деле не нужен, лучший из всех миров (читабельность, скорость и переносимость):

_mm_xor_ps(vec, _mm_set1_ps(-0.f))
person LiraNuna    schedule 20.08.2010

Жизненный урок о программировании до 3 часов ночи.....

Я никогда не пытался просто использовать унарный минус в моем упакованном векторе. Это на самом деле компилируется и имеет ту же производительность, что и подход без SIMD.

person nsanders    schedule 29.07.2010
comment
Однако будьте осторожны - использование подобных gcc-расширений делает ваш код непереносимым. - person Paul R; 03.08.2010