在我目前正在研究的項目中,我經常需要在可以插入元素的已排序數組中找到儘可能最低的索引(如C++中的std :: lower_bound) 。 使用SSE加速我的算法似乎很有吸引力,因爲我使用的uint32數組的大小通常是處理器高速緩存行的大小。 我從來沒有使用SSE指令,所以我無法弄清楚這個函數的SSE實現是什麼樣子。請給出提示,以幫助我用SSE優化寫出來。使用SSE加速lower_bound函數
3
A
回答
9
沒有什麼像std::lower_bound
使用SSE進行擴展。 SSE讓事情變得更快的原因是它允許你一次進行多次計算。例如,單個SSE指令可能會導致4次乘法操作一次執行。但是,std::lower_bound
的運行方式無法並行化,因爲算法中的每個步驟都需要前面步驟的比較結果。此外,它已經是O(lg n),因此不太可能成爲瓶頸。此外,在轉向內聯彙編之前,您應該知道,無論何時使用內聯彙編,您都會擊敗可能在程序的該部分發生的大多數編譯器優化,並且通常會導致程序運行速度變慢 - 編譯器通常寫出比人類更好的彙編語言。
如果您想使用SSE,您最好使用內部函數 - 編譯器提供的特殊「函數」或關鍵字,它調用SSE指令,但否則會進行優化。這些內在函數可在Microsoft's Visual C++以及GNU Compiler Collection中找到。 (可能是大多數的編譯器,請查閱你的編譯器的文檔)
而不是試圖加速使用SSE的std::lower_bound
,你應該嘗試不需要首先調用它。例如,如果您不斷地使用lower_bound
將元素插入到矢量中,則應該知道您已有效創建的是insertion sort,並且該插入排序很差,這將需要四次時間。將新元素放在向量的末尾,然後在需要排序的時候對向量進行排序,可能會更好。這樣可以將事物排序爲O(n lg n)。如果您的數據訪問模式過於頻繁,那麼您應該使用類似於std::set
的替代方法,它爲插入提供O(lg n)操作,而不是您當前使用的O(n + lg n)插入與載體相處。
當然,記得基準:)
相關問題
- 1. OpenMP + SSE不加速
- 2. SSE:沒有看到使用_mm_add_epi32加速
- 3. C++中的upper_bound/lower_bound函數
- 4. 使用 'LOWER_BOUND'
- 5. 使用std :: lower_bound
- 6. 使用SSE加速計算 - 存儲,加載和對齊
- 7. 使用SSE轉換函數SIMD
- 8. Radix/Patricia Trie的STLish lower_bound函數
- 9. SSE int64內在函數
- 10. 使用自動矢量化和sse依賴數據大小的速度加快
- 11. 在lower_bound上使用lambda
- 12. 加速遞歸函數
- 13. cor()函數如何加速?
- 14. 加速Python w/sqlalchemy函數
- 15. 加速AVR函數指針
- 16. 沒有與較新的gcc調用'lower_bound'的匹配函數
- 17. 在SSE內部函數中使用'錯誤'指令的gcc(6.1.0)
- 18. 如何在MS Visual Studio中使用SSE內在函數?
- 19. 使用SSE內在函數的矩陣乘法
- 20. 使用SSE內在函數向量化2D模板
- 21. 使用openmp並行化sse intrinsics函數c
- 22. 加速熊貓應用函數
- 23. R加速glm在應用函數
- 24. 使用sse或mmx將rgb平面加速到rgba交叉轉換
- 25. LOWER_BOUND拋出「錯誤C2914:‘的std :: LOWER_BOUND’:不能推導出模板參數的函數參數不明確」
- 26. 通過使用SSE進行鉗位的快速雙轉換>
- 27. 使用SSE指令進行快速圖像處理?
- 28. SSE內在函數檢查零標誌
- 29. SSE內在函數運算錯誤
- 30. SSE,內在函數和對齊
花時間做一些研究。然後想一想,也許會嘗試一些東西來獲得它的工作方式的「感覺」。然後問一個更直接的問題 - 這裏沒有問題。 – 2011-01-22 20:24:11