我試圖想出一種方法來讓計算機爲我做一些工作。我正在使用SIMD(SSE2 & SSE3)計算交叉乘積,我想知道它是否可以更快。目前,我有以下幾點:從腳本中較高的函數調用較低的函數
const int maskShuffleCross1 = _MM_SHUFFLE(3,0,2,1); // y z x
const int maskShuffleCross2 = _MM_SHUFFLE(3,1,0,2); // z x y
__m128 QuadCrossProduct(__m128* quadA, __m128* quadB)
{
// (y * other.z) - (z * other.y)
// (z * other.x) - (x * other.z)
// (x * other.y) - (y * other.x)
return
(
_mm_sub_ps
(
_mm_mul_ps
(
_mm_shuffle_ps(*quadA, *quadA, maskShuffleCross1),
_mm_shuffle_ps(*quadB, *quadB, maskShuffleCross2)
),
_mm_mul_ps
(
_mm_shuffle_ps(*quadA, *quadA, maskShuffleCross2),
_mm_shuffle_ps(*quadB, *quadB, maskShuffleCross1)
)
)
);
}
正如你可以看到,有四個_mm_shuffle_ps
的在那裏,我不知道如果我能與_mm_unpackhi_ps
和_mm_unpacklo_ps
的組合,其分別返回a2 a3 b2 b3
和a0 a1 b0 b1
,並取代它們稍快。
我無法弄清楚紙上的內容,但我想到了一個解決方案。如果讓計算機強制執行所需的步驟,該怎麼辦?只是遞歸地通過不同的選項,看看什麼給出了正確的答案。
我得到了它與多工作,當我想它返回它返回(3,12,27,0):
startA = _mm_set_ps(1.00, 2.00, 3.00, 0.00);
startB = _mm_set_ps(3.00, 3.00, 3.00, 0.00);
result0 = _mm_mul_ps(startA, startB);
// (3.00, 6.00, 9.00, 0.00)
result1 = _mm_mul_ps(startA, result0);
// (3.00, 12.00, 27.00, 0.00)
非常好,如果我這樣說自己。
但是,當我想實現鴻溝時,我偶然發現了一個問題。乘法不僅需要調用乘法,還必須調用除法。好吧,所以我們把分水嶺放在上面乘。但鴻溝不僅不得不稱爲鴻溝,它還必須稱爲乘數,這在腳本中較低,因此它還不存在。
我從Visual C++中的一個空白控制檯應用程序開始,並將所有內容放在QuadTests.cpp中。
如何確保這兩個功能可以互相呼叫?
在此先感謝。
當然! :D 它只是滑了我的腦海,但我知道堆棧溢出的人類搜索引擎可以幫助我。 ;) – knight666 2009-09-05 15:00:05