我正在寫一些音頻處理軟件,我需要知道如何使用SSE2雙精度指令來進行飽和運算。我的值需要在-1和1之間進行歸一化。有沒有一種聰明的方法可以用SSE2內在的方式來做到這一點,或者我需要2組if/else語句(每個值有一個)?SSE2飽和算術
SSE2飽和算術
回答
要將雙精度值裁剪到-1.0到+1.0的範圍,可以使用最大/最小操作。例如。如果你有一個緩衝,buff
,N double
值:
const __m128d kMax = _mm_set1_pd(1.0);
const __m128d kMin = _mm_set1_pd(-1.0);
for (int i = 0; i < N; i += 2)
{
__m128d v = _mm_loadu_pd(&buff[i]);
v = _mm_max_pd(v, kMin);
v = _mm_min_pd(v, kMax);
_mm_storeu_pd(&buff[i], v);
}
好!這真的很有趣。感謝您的幫助 –
哇......我剛剛發現了一些非常有趣的東西。所有的內在功能使其變慢。我越用越慢。僅使用原始類型(雙精度),我在1738納秒內完成了500000次加法運算。使用SSE2僅用於添加,我得到了5198納秒。使用上面的答案我得到了31888納秒。這對我來說毫無意義。儘管如此,他們使用了xmm寄存器。難道這是事實:編譯器知道如何更好地優化它,當它做的一切? –
兩種可能的解釋 - (1)你使用的調試版本沒有優化(即'-O0')而不是發佈版本('-O3')和/或(2)你的編譯器已經對標量進行了矢量化碼。 –
- 1. ReadWriteLock writelock飽和
- 2. 液體和算術
- 3. 用於GCC雙重計算的SSE2
- 4. Matlab fwrite飽和度
- 5. 鎖聲明飽和
- 6. 什麼是飽和和亮度CSS濾鏡背後的算法?
- 7. 算術運算
- 8. 算術算法
- 9. 算術運算
- 10. 算術運算
- 11. 算術運算
- 12. 算術計算
- 13. 算術運算
- 14. JBoss的飽和和Sonarqube
- 15. 算術指針和fstream C++
- 16. nullptr和指針算術
- 17. 結構和指針算術
- 18. 重載流和算術運算問題
- 19. 按位算術和運算符
- 20. 存儲和使用算術運算符
- 21. 字符串和算術運算
- 22. Perl模式匹配和算術運算
- 23. ATT裝配(算術和邏輯運算)
- 24. 算術運算符和鍵值編碼
- 25. 分配值和做算術計算
- 26. 算術溢出與算術運
- 27. CSH算術運算
- 28. BCD算術運算
- 29. 算術運算符
- 30. 去飽和使用pixastic - jquery
爲什麼你甚至使用雙精度音頻?無論如何,直到你最終轉換成你正在使用的任何音頻格式,你都不需要飽和,此時你可以使用飽和包指令(如果是整數格式)或最大/最小指令,如果你想做它明確。 –
那麼音頻格式可以作爲int32,int64,float32和float64處理。我恰好現在正在做float64部分。 –
確定 - 只需使用最大/最小值操作 - 請參閱下面的答案... –