如何將兩個64位整數乘以另一個2個64位整數? 我沒有找到任何可以做到的指令。2個64位整數的SSE乘法
回答
您需要使用32位乘法操作來實現您自己的64位乘法例程。雖然這可能不會比使用標量代碼更高效,特別是因爲要進行所有必需的操作,會有很多混亂的向量。
從我的頭頂來看,是不是有一個'pmuldqq'或SSE4中加入了什麼? – hirschhornsalz
SSE4中有一個'pmuldq',它是一個32x32 => 64位乘法,因此您可以將它用作64x64位乘法的構建塊。 –
你知道最好的標量算法嗎(假設你只有32位硬件)?這是我會做的。 (a * b)=(al + ah)*(b1 * bh)= t1 + t2 + t3 + t4其中t1 = al * b1,t2 = al * bh,t3 = ah * bl t4 = ah * bh。每個術語將是一個64位數字。那麼t2和t3將不得不再次分成低和高,最後的數將是(a * b)l = t1 + t2l + t31,(a * b)h = t4 + t2h + t3h + c,其中c是來自(a * b)l的任何進位。這是4次修改,還有7次修改。這是這個地方嗎? –
我知道這是一個古老的問題,但我實際上正在尋找這個。由於仍然沒有指令,我用Paulul提到的pmuldq自己實現了64位乘法。這是我想出的
__m128i Multiply64Bit(__m128i a, __m128i b)
{
auto ax0_ax1_ay0_ay1 = a;
auto bx0_bx1_by0_by1 = b;
// i means ignored
auto ax1_i_ay1_i = _mm_shuffle_epi32(ax0_ax1_ay0_ay1, _MM_SHUFFLE(3, 3, 1, 1));
auto bx1_i_by1_i = _mm_shuffle_epi32(bx0_bx1_by0_by1, _MM_SHUFFLE(3, 3, 1, 1));
auto ax0bx0_ay0by0 = _mm_mul_epi32(ax0_ax1_ay0_ay1, bx0_bx1_by0_by1);
auto ax0bx1_ay0by1 = _mm_mul_epi32(ax0_ax1_ay0_ay1, bx1_i_by1_i);
auto ax1bx0_ay1by0 = _mm_mul_epi32(ax1_i_ay1_i, bx0_bx1_by0_by1);
auto ax0bx1_ay0by1_32 = _mm_slli_epi64(ax0bx1_ay0by1, 32);
auto ax1bx0_ay1by0_32 = _mm_slli_epi64(ax1bx0_ay1by0, 32);
return _mm_add_epi64(ax0bx0_ay0by0, _mm_add_epi64(ax0bx1_ay0by1_32, ax1bx0_ay1by0_32));
}
您是否對代碼進行了任何基準測試,而不是使用通用寄存器進行基準測試?我對結果很感興趣,因爲我正在做64乘64乘的工作。 – jeteon
我只是做了一些基準測試,它比標量乘法(用cl/O2編譯)還要快。平均約831600000次乘法運算。在我有點強大的i7 5820k上0.37秒。同時,相同的標量乘以平均值1.71。所以它快了4倍,這有點怪異。我想cl很擅長優化超標量指令 – JukesOnYou
- 1. 如何乘以2個32位整數產生一個64位整數?
- 2. 兩個64位數的乘法運算
- 3. 自動比較2個64位整數所需的最小SSE/AVX版本?
- 4. 算法使用32位無符號整數乘64位數
- 5. 64位乘法器在Fpga
- 6. SSE 64位寄存器
- 7. SSE整數除法?
- 8. SSE矩陣,矩陣乘法
- 9. SSE乘法16 x uint8_t
- 10. 64位整數在64位與86 OS
- 11. 我怎樣才能精確地乘以64位的整數?
- 12. 如何64位整數分成兩個32位的整數
- 13. 彙編乘法操作64位
- 14. 64位定點乘法錯誤
- 15. 64 SSE數據類型
- 16. Neo4j中的64位整數
- 17. Hashtable的64位整數
- 18. 大整數乘法(階乘)
- 19. 「模擬」 64位整數有兩個32位整數
- 20. 如何將兩個64位整數連接成128位整數?
- 21. perl下64位整數
- 22. 長整數乘法
- 23. 無整數乘法*
- 24. 大整數乘法
- 25. C++:在一個有符號的64位整數中的兩個無符號64位整數的差異
- 26. 將64位整數中的每一位比較爲一個32位整數
- 27. 大會:與32位寄存器的64位乘法
- 28. 需要在32位長的機器上執行64位乘法
- 29. SSE除以整數
- 30. 存儲四個16位整數與SSE內在函數
在這種情況下,「兩個64位整數」是什麼意思?你的意思是一對64位整數(一個複數)還是一個128位整數,表示爲一對64位整數? –
我的意思是一個單一的m128i位整數表示爲一對64位整數 –
可能重複[此問題](http://stackoverflow.com/questions/12200698/is-it-possible-to-use-sse-v2然後,生成一個128位寬的整數)。 –