Перемножение векторов и сложение результата - Assembler

Узнай цену своей работы

Формулировка задачи:

как на SSE сделать следующее:
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];
умножение векторов так: PMULLW
    __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";
а вот как сложить еще? вроде есть такая команда? или как сложить все числа внутри xmm регистра?

Решение задачи: «Перемножение векторов и сложение результата»

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

Объяснение кода листинга программы

  1. movq mm0,[vectorA]; Изначально вектор A копируется в регистр mm0. Значение регистра mm0 после этого шага: a3 | a2 | a1 | a0.
  2. movq mm1,[vectorB]; Вектор B копируется в регистр mm1. Значение регистра mm1 после этого шага: b3 | b2 | b1 | b0.
  3. pmaddwd mm0,mm1; Происходит перемножение векторов A и B с последующим сложением результатов. Результат этого шага: a3b3+a2b2 | a1b1+a0b0.
  4. movq mm2,mm0; Регистр mm2 копирует значение регистра mm0.
  5. psrlq mm2,32; Происходит сдвиг регистра mm2 на 32 бита вправо.
  6. paddd mm2,mm0; Происходит сложение регистра mm2 и mm0. Результат этого шага: a3b3+a2b2+a1b1+a0b0 | a1b1+a0b0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы