程式優化 演算法對上SIMD OMP 0

2021-06-21 09:59:44 字數 1560 閱讀 2613

程式優化是個永恆的話題。隨著mmx,sse,sse2硬體的普及,越來越多的編譯器開始支援simd指令程式設計,程式設計師編寫程式時可以很方便的利用先進的硬體為程式帶來更大的效能提公升,所為「花一樣錢補兩樣」,真是惠而不費,程式設計師的福音。

能夠使用高效能的硬體固然好,不過,如果親身進行例項分析,想當然的認為只要利用硬體的先進功能就能帶來程式效率上提公升,可能反而會編制出能夠利用高階硬體功能的低效程式來。

究竟是演算法和高階硬體誰能夠取得更高的效能?傳統的演算法與先進硬體誰能夠為程式帶來更大的效能提公升?還是讓我們寫個程式例項,讓資料來說話。

假設要寫這樣乙個程式:對一幅尺寸為1024x1024,每畫素為32位的影象進行某種處理,處理方法如下: 1)

如果各顏色分量與0xff的差值之和小於24,則轉到2步進行處理,否則處理下一畫素 2)

對畫素進行如下處理:

過濾比值:顏色分量/255

新的顏色分量=原顏色分量*(1-過濾比值) + 指定顏色的分量 * 過濾比值

偽碼如下:

if ( (255 * 3 - (r + g + b)) < 3 * 8 )

該處理方法可以用於顏色過濾。

擬使用以下方法來進行處理: 1)

傳統方法 2)

傳統方法+omp 3)

使用intrinsics,進行simd處理 4)

使用intrinsics,進行simd處理+omp

為了提高度量精度,使用queryperfromancefrequency記錄時間。為了方便使用,定義了以下巨集:

//申明時間度量變數

#define

decl_perf()     __int64 m_counterfreq, m_counterstart, m_counterend;

//初始化時間變數

#define

init_perf()     queryperformancefrequency((large_integer *)&m_counterfreq);

//記錄操作開始時間

#define

begin_perf()    queryperformancecounter((large_integer *)&m_counterstart);

//記錄結束時間

#define

end_perf()      queryperformancecounter((large_integer *)&m_counterend);

//計算操作耗費的時間

#define

get_perf()      ((m_counterend - m_counterstart) / (float)m_counterfreq)

每種處理方法都在進行處理迴圈的之前,先呼叫begin_perf(),並在結束之後,立即呼叫end_perf(),然後以get_perf()作為返回值。同時,使用具有雙核cpu的計算機來執行程式,以真正發揮omp的作用。

測試機器(我的愛機):

cpu:amd x64 3600+

記憶體:萬紫千紅1g單條

主機板:七彩虹nf4

硬碟:西捷250g sata

顯示卡:七彩虹1650xg cf3

程式優化 演算法對上SIMD OMP 1

傳統處理方法 傳統處理方法純粹基於c 通過指標操作進行處理。通常的優化是使用定點數來代替浮點數,這裡使用的方法為 比值 顏色分量值 65535 255 轉換成位移操作 比值 顏色分量值 16 8 進行一步簡化 比值 顏色分量值 8 如下 float test normal filter ptr 4 ...

程式優化 演算法對上SIMD OMP 3

使用intrinsics方法,實現simd處理 使用intrinsics,可以利用硬體的simd指令進行處理。mmx,sse,sse2 amd已經通過交叉授權取得該技術 看起來真有那麼美好麼?讓我們拭目以待。在處理中同樣使用了定點數技術。float test simd filter ptr buf ...

GUI程式優化演算法之矩形覆蓋

在一些gui程式中,需要在乙個圖形容器中同時繪製若干個矩形區域的圖形,而且這些矩形區域可能相互覆蓋,這就類似於windows桌面 中各個矩形窗體的相互覆蓋,這時程式繪製這些矩形圖形時,應當不需要全部繪製 如圖1中的矩形b,c 甚至其中的某些被其他矩形完全覆蓋的矩形區域不需要全部繪製 如圖1中的矩形a...