4x4浮点矩阵*矢量乘积的x86 SSE优化提示

时间:2018-09-19 13:01:20

标签: assembly optimization x86 sse

仅出于学习目的: 我有一个获取三个参数的函数,如下所示。

- a pointer to a 4x4 floating point matrix
- a pointer to a 4x1 floating point vector (input vector)
- a pointer to a 4x1 floating point vector (output vector).

该函数的任务只是将矩阵与输入向量相乘,并将结果保存为输出向量。

C / C ++中的函数声明看起来像这样:

void mult(MATRIX4x4* m, VECTOR4x1* in, VECTOR4x1* out);

请注意,MATRIX4x4和VECTOR4x1结构均为16个字节对齐。

我想为任务使用x86-SSE寄存器和指令。我在汇编中编写的代码如下:

.486
.xmm
.model flat
; .........................................................
public ___asm_vec_mat_product
; .........................................................
CODE segment dword public 'CODE' use32
ASSUME cs:CODE
; .........................................................
___asm_vec_mat_product proc near
    push ebp
    mov  ebp, esp   

    mov ecx, [ebp + 8 ]                     ;get matrix_4x4 pointer
    mov esi, [ebp + 12]                     ;get vector_4x1 input  pointer
    mov edi, [ebp + 16]                     ;get vector_4x1 output pointer

    movaps xmm4, xmmword ptr [esi]          ; load both input and output vectors in a 128bit register 
    movaps xmm5, xmmword ptr [edi]          ; load both input and output vectors in a 128bit register 

    movaps xmm0, xmmword ptr [ecx]          ; get matrix elements
    movaps xmm1, xmmword ptr [ecx + 16]     ;
    movaps xmm2, xmmword ptr [ecx + 32]     ;
    movaps xmm3, xmmword ptr [ecx + 48]     ;       
    ; do the math -----------------------------------
        movaps   xmm7, xmm4
        movaps   xmm6, xmm4

        dpps     xmm7, xmm0, 11110001b      
        dpps     xmm6, xmm1, 11110001b
        insertps xmm5, xmm7, 00000000b  
        insertps xmm5, xmm6, 00010000b

        movaps   xmm7, xmm4

        dpps     xmm4, xmm2, 11110001b
        dpps     xmm7, xmm3, 11110001b
        insertps xmm5, xmm4, 00100000b
        insertps xmm5, xmm7, 00110000b

        movaps xmmword ptr [edi], xmm5      ; save the result as a 128bits value 
    ; do the math -----------------------------------
    pop  ebp
    ret
___asm_vec_mat_product endp
; .........................................................
CODE ends
end
; .........................................................

它可以完美运行,但问题是,是否还有更多空间可以使它更快地执行,并使用x86-SSE指令对其进行更多优化。

p.s .:我已经阅读了Agner Fog提供的C ++和程序集优化手册。

我的CPU不支持AVX,所以我只使用SSE4.1。

0 个答案:

没有答案