我正在努力将一些代码转换为 SSE,虽然我有正确的输出,但结果却比标准 c++ 代码慢。
我需要这样做的代码是:
float ox = p2x - (px * c - py * s)*m;
float oy = p2y - (px * s - py * c)*m;
我对 SSE 代码的了解是:
void assemblycalc(vector4 &p, vector4 &sc, float &m, vector4 &xy)
{
vector4 r;
__m128 scale = _mm_set1_ps(m);
__asm
{
mov eax, p //Load into CPU reg
mov ebx, sc
movups xmm0, [eax] //move vectors to SSE regs
movups xmm1, [ebx]
mulps xmm0, xmm1 //Multiply the Elements
movaps xmm2, xmm0 //make a copy of the array
shufps xmm2, xmm0, 0x1B //shuffle the array
subps xmm0, xmm2 //subtract the elements
mulps xmm0, scale //multiply the vector by the scale
mov ecx, xy //load the variable into cpu reg
movups xmm3, [ecx] //move the vector to the SSE regs
subps xmm3, xmm0 //subtract xmm3 - xmm0
movups [r], xmm3 //Save the retun vector, and use elements 0 and 3
}
}
由于它很难阅读代码,我将解释我做了什么:
加载向量4,xmm0 _____ p = [px,py,px,py]
mult。通过vector4,xmm1 _ cs = [c,c,s,s]
__________________________mult----------------------------
结果,_____________ xmm0 = [px c, py c, px s, py s]
重用结果,xmm0 = [px c, py c, px s, py s]
洗牌结果, xmm2 = [py s, px s, py c, px c]
_____________________减法---------- ---------------
结果,xmm0 = [px c-py s,py c-px s,px s-py c,py s-px c]
重用结果,xmm0 = [px c-py s, py c-px s, px s-py c, py s-px c]
load m vector4, scale = [m, m, m, m]
__________________________mult---- ------------------------
结果,xmm0 = [(px c-py s) m, (py c-px*s) m, (px s-py*c) m, (py s-px*c) m]
加载 xy vector4, xmm3 = [p2x, p2x, p2y, p2y]
重用, xmm0 = [(px c-py*s) m, (py c-px*s) m, (px s-py*c) m, (py s-px*c) m]
_____________________减------------------ -------
结果,xmm3 = [p2x-(pxc-py*s) m, p2x-(py c-px*s) m, p2y-(px s-py*c) m, p2y-(py s-px*c)*m]
然后 ox = xmm3[0] 和 oy = xmm3[3],所以我基本上不使用 xmm3[1] 或 xmm3[4]
对于阅读本文的困难,我深表歉意,但我希望有人能够为我提供一些指导,因为标准 c++ 代码运行时间为 0.001444 毫秒,而 SSE 代码运行时间为 0.00198 毫秒。
让我知道我是否可以做些什么来进一步解释/清理一下。我尝试使用 SSE 的原因是因为我运行了这个计算数百万次,它是减慢我当前代码的一部分。
提前感谢您的帮助!布雷特