我正在努力将一些代码转换为 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]
多。通过向量4,xmm1 _ cs = [c , c , s , s ]
__________________________多----------------------------
结果,_____________ xmm0 = [pxc, pyc, pxs, pys]
重用结果,xmm0 = [pxc, pyc, pxs, pys]
洗牌结果,xmm2 = [pys, pxs, pyc, pxc]
_____________________减去 - - - - - - - - - - - - - -
结果,xmm0 = [pxc-pys, pyc-pxs, pxs-pyc, pys-pxc]
重用结果,xmm0 = [pxc-pys, pyc-pxs, pxs-pyc, pys-pxc]
加载 m 个向量4,scale = [m, m, m, m]
__________________________多----------------------------
结果,xmm0 = [(pxc-pys)m, (pyc-px*s)m, (pxs-py*c)m, (pys-px*c)m]
加载xy向量4,xmm3 = [p2x,p2x,p2y,p2y]
重用,xmm0 = [(pxc-py*s)m, (pyc-px*s)m, (pxs-py*c)m, (pys-px*c)m]
_____________________减去 - - - - - - - - - - - - - -
结果,xmm3 = [p2x-(pxc-py*s)m, p2x-(pyc-px*s)m, p2y-(pxs-py*c)m, p2y-(pys-px*c)*m]
然后 ox = xmm3[0] 和 oy = xmm3[3],所以我基本上不使用 xmm3[1] 或 xmm3[4]
对于阅读本文的困难,我深表歉意,但我希望有人能够为我提供一些指导,因为标准 C++ 代码的运行时间为 0.001444 毫秒,SSE 代码的运行时间为 0.00198 毫秒。
让我知道我是否可以做任何事情来进一步解释/清理这一点。我尝试使用 SSE 的原因是因为我运行此计算数百万次,并且它是减慢我当前代码速度的部分原因。
预先感谢您的任何帮助!
布雷特