私は少しのコードを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
}
}
コードを読むのは非常に難しいので、私がしたことを説明します。
ロードされたvector4、xmm0 _____ p = [px、py、px、py]
mult。vector4により、xmm1 _ cs = [c、c、s、s]
__________________________ mult ----------------------------
result、_____________ 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、pxc ]
_____________________減算------------- ---------------
結果、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]
load 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]
_____________________ subtract --------------------- -------
結果、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.001444msで実行され、SSEコードは0.00198msで実行されるため、誰かが私に何らかのガイダンスを提供してくれることを願っています。
これをさらに説明/クリーンアップするために私にできることがあれば教えてください。私がSSEを使おうとしている理由は、この計算を何百万回も実行しているためです。これは、現在のコードの速度を低下させている原因の一部です。
助けてくれてありがとう!ブレット