Mult плюс сдвиг влево, операции с использованием инструкций ассемблера MMX

Я ищу выполнение операции shl(mult(var1,var2),1), где mult умножает var1 и var2 (оба являются 16-битными целыми числами со знаком), а shl арифметически сдвигает влево результат умножения. Результат должен быть насыщенным, т. е. int32 max или int32 min, если происходит переполнение или потеря значимости, и mult(-32768,-32768)=2147483647.

Мне нужно сделать эту операцию для нескольких значений эффективным способом, для чего я думаю использовать набор инструкций MMX/SSE. Я думал о создании mult(sign_extesion(var1), shl(sign_extension(var2))), но только что обнаружил, что версии насыщения MMX mult() не существует. Вы знаете какой-нибудь другой способ получить его?


person LooPer    schedule 27.07.2011    source источник


Ответы (1)


Я думаю, что следующее должно работать для вас. Существует только один потенциальный случай переполнения (SHRT_MIN * SHRT_MIN), и он обрабатывает это явно:

#include <limits.h>
#include <mmintrin.h>

int main(void)
{        
    __m64 v1 = _mm_set_pi16(0, SHRT_MAX, 0, SHRT_MIN);
    __m64 v2 = _mm_set_pi16(0, SHRT_MIN, 0, SHRT_MIN);
    __m64 v = _mm_madd_pi16(v1, v2); // 16 x 16 signed multiply
    v = _mm_slli_pi32(v, 1);         // shift left by 1 bit to get full range
    __m64 vcmp = _mm_cmpeq_pi32(v, _mm_set1_pi32(INT_MIN));
                                     // test for SHRT_MIN * SHRT_MIN overflow
    v = _mm_add_pi32(v, vcmp);       // and correct if needed

    return 0;
}
person Paul R    schedule 27.07.2011
comment
есть ли у вас опыт о том, сколько выигрыша может быть получено при умножении с помощью MMX вместо одиночных? - person LooPer; 28.07.2011
comment
@LooPer: это зависит от процессора, но большинство современных процессоров Intel имеют два целочисленных ALU, поэтому, вероятно, от двухстороннего SIMD, такого как этот, мало что можно получить. Если вы можете перейти на 128-битный SSE, вы должны увидеть значительный прирост производительности, при условии, что пропускная способность памяти не ограничена. - person Paul R; 28.07.2011