我用寄存器xmm0存储除数a(a0, a1, a2, a3)(单精度),用xmm1存储被除数b(b0, b1, b2, b3)(单精度),
一般情况下,应该是a0 = a0 / b0, a1 = a1/b1, a2= a2/b2, a3=a3/b3, 若bi=0,测ai也应该为0,其中i ~[0,3].
请问在SSE下该如何高效实现??
------解决方案--------------------
多说两句,SIMD指令运算异常(比如除以0)不会导致程序异常结束的,只是结果无意义而已,比如是INF(无穷大)、NAN(不是有效数)之类的。
------解决方案--------------------
写个小程序测试一下:
#include <stdio.h>
float PDest[4] = {1.0, 2.0, 0.0, 0.0};
float PSrc[4] = {1.0, 2.0, 3.0, 0.0};
// Calcutes Dest[0..3] = Dest[0..3] / Src[0..3]
void __DIVPS_FIX(float *Dest, float *Src)
{
__asm{
mov eax,Dest
mov edx,Src
pxor xmm2,xmm2
movdqu xmm1,[edx]
movdqu xmm0,[eax]
pcmpeqd xmm2,xmm1
rcpps xmm1,xmm1
pandn xmm2,xmm1
mulps xmm0,xmm2
movdqu [eax],xmm0
}
}
int main()
{
__DIVPS_FIX(PDest, PSrc);
printf("%8.3f %8.3f %8.3f %8.3f\n", PDest[0], PDest[1], PDest[2], PDest[3]);
printf("%08X %08X %08X %08X (hex)\n", *(int*)&PDest[0], *(int*)&PDest[1], *(int*)&PDest[2], *(int*)&PDest[3]);
return 0;
}
把mulps xmm0,xmm2改成mulps xmm0,xmm1就能看见未修正前的结果。
------解决方案--------------------
啊,Calcutes -> Calculates