Перемножение векторов и сложение результата - Assembler
Формулировка задачи:
как на SSE сделать следующее:
умножение векторов так: PMULLW
а вот как сложить еще? вроде есть такая команда?
или как сложить все числа внутри xmm регистра?
int a[4] = {1,2,3,4}; int b[4] = {5,6,7,8}; a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];
__declspec(align(16)) __int32 a[4] = { 300, 4, 4, 12 }; __declspec(align(16)) __int32 b[4] = { 5, 13, 3, 4 }; __asm { align 16 MOVAPS xmm0, a; MOVAPS xmm1, b; PMULLW xmm1, xmm0; MOVAPS b, xmm1; }; std::cout << b[0] << " " << b[1] << " " << b[2] << " " << b[3] << "\n";
Решение задачи: «Перемножение векторов и сложение результата»
textual
Листинг программы
movq mm0,[vectorA]; [mm0] = a3 | a2 | a1 | a0 movq mm1,[vectorB]; [mm1] = b3 | b2 | b1 | b0 pmaddwd mm0,mm1; [mm0] = a3*b3+a2*b2 | a1*b1+a0*b0 movq mm2,mm0 psrlq mm2,32 paddd mm2,mm0; [mm2] = a3*b3+a2*b2+a1*b1+a0*b0 | a1*b1+a0*b0
Объяснение кода листинга программы
- movq mm0,[vectorA]; Изначально вектор A копируется в регистр mm0. Значение регистра mm0 после этого шага: a3 | a2 | a1 | a0.
- movq mm1,[vectorB]; Вектор B копируется в регистр mm1. Значение регистра mm1 после этого шага: b3 | b2 | b1 | b0.
- pmaddwd mm0,mm1; Происходит перемножение векторов A и B с последующим сложением результатов. Результат этого шага: a3b3+a2b2 | a1b1+a0b0.
- movq mm2,mm0; Регистр mm2 копирует значение регистра mm0.
- psrlq mm2,32; Происходит сдвиг регистра mm2 на 32 бита вправо.
- paddd mm2,mm0; Происходит сложение регистра mm2 и mm0. Результат этого шага: a3b3+a2b2+a1b1+a0b0 | a1b1+a0b0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д