【发布时间】:2010-05-27 17:40:14
【问题描述】:
我正在努力将一些代码转换为 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 ]
多。通过vector4,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 vector4, scale = [m, m, m, m]
__________________________多----------------
结果,xmm0 = [(pxc-pys)m, (pyc-px*s)m, (pxs-py *c)m, (pys-px*c)m]
加载 xy vector4, 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 的原因是因为我运行了这个计算数百万次,这是导致我当前代码变慢的部分原因。
提前感谢您的帮助! 布雷特
【问题讨论】:
-
他们说今天优化编译器通常可以比普通的汇编程序员更好地优化代码。你看过编译器生成的汇编代码吗?
-
我没有,但我会尝试进一步调查,谢谢!
-
你在什么硬件上计时?
-
我使用的是奔腾 4 HT,2.79GHz,运行 XP
-
我正在阅读这篇文章 (linux-kongress.org/2009/slides/…),它说带有 -O3 优化的 gcc 4.4 很可能会为您矢量化代码。