我看了一下sse和mmx指令集,沒有3聲道圖像處理的指令。當然,對於許多操作,您可以使用相同的說明,例如平均兩張圖像。但是當涉及到通過線性轉換來解混頻道或混合不同頻道等操作時,使用32位圖像似乎更容易。使用simd指令時,32位圖像處理是否比24位圖像處理更快?
24位與32位圖像的典型圖像處理任務的性能特點如何?
我看了一下sse和mmx指令集,沒有3聲道圖像處理的指令。當然,對於許多操作,您可以使用相同的說明,例如平均兩張圖像。但是當涉及到通過線性轉換來解混頻道或混合不同頻道等操作時,使用32位圖像似乎更容易。使用simd指令時,32位圖像處理是否比24位圖像處理更快?
24位與32位圖像的典型圖像處理任務的性能特點如何?
如果圖像很大並且操作很簡單(如混合等),24位/像素會更快。
很多時候圖像處理中的操作都非常簡單,但是您可以執行數百萬個操作。所以用於將數據從主內存移入和移出CPU的時間可以很容易地支配算法的性能。
因此,24位/像素圖像可以提供超過32位/像素圖像的優勢,因爲移動的數據少了1/4。
雖然寫入圖像處理代碼可以很好地處理24位/像素。 SSE指令並不適合數據,因此您必須隨機播放字節,然後您必須處理所有不同的對齊。
如果您正在使用的圖像很小並且適合l1或l2緩存,則情況會有所不同,並且CPU時間將會影響性能。在這些情況下,32位/像素執行速度更快。
在PSHUFB(aka _mm_shuffle_epi8)拆分通道的新x86 CPU上可以在幾個週期內完成,並且由於將像素寬度擴展到32位,所以可能比進行額外的存儲器訪問更便宜。在沒有PSHUFB的舊x86 CPU上,它需要大量的洗牌或解包指令,並且32位像素效率更高。
在NEON拆分的ARM CPU上,通道可由加載存儲單元免費完成。在沒有NEON分裂的ARM CPU上,通道可以使用ARMv6 SIMD指令完成,每個像素約3條指令。
我忽略了PSHUFB的說明。好的提示。謝謝。 – 2012-08-11 11:03:13
關於緩存的評論非常有趣。謝謝。 – 2012-08-11 11:02:26
實際上,如果我沒有記錯的話,你可以做補丁(我認爲這叫做緩衝),並且在給定大小的補丁或塊上面進行工作,以適合L1或L2緩存。然後你沿矩陣移動你的工作塊。如果翻牌數很高,那麼快速緩存的訪問將抵消複製補丁的成本。 – 2012-08-12 21:21:30