在計算機體系結構中,並行度是指指令並行執行的最大條數。在設計並行程式時,我們可以簡單地把並行度認為是在多核/眾核處理器上能同時執行的執行緒數/程序數。對於同乙個程式,並行度設計方法的不同將會嚴重影響到程式的效能。mic上的並行度優化主要涉及並行執行緒/程序的數目、並行層級、並行粒度等方面。
1 並行度
mic卡包含眾多的物理核,同時每個核上可以開啟4個執行緒,因此,程式設計師只有設計足夠多的執行緒/程序才可以把所有的核利用起來。例如一塊60個核的mic卡上,我們最多可以開啟240個執行緒,最佳執行緒數一般是每個核設定3個或4個執行緒,圖1展示的是某一實際高效能應用程式在60個核的mic卡上設定不同執行緒數的效能擴充套件性結果圖,從該圖可以看出,只有讓mic卡上的所有核都充分利用起來才能發揮mic的最大效能。當然,也不是在mic卡上設定的執行緒數越多越好,執行緒數太多的話,執行緒開銷比較大,我們只需要設定的執行緒數可以保證程式併發度和mic核的高利用率即可。
圖1 某一高效能應用程式在mic上的效能擴充套件性
2並行粒度
並行程式是否選擇了合適的層級上實現並行,是效能優化中需要關心的重要問題。根據並行程式盡可能使用粗粒度的並行原則,盡可能在最上層並行化**。在外層上並行除了帶來易程式設計的好處之外,還可以帶來好的效能:增加粒度,減少了執行緒排程和銷毀的次數,也就是減少了執行緒本身的開銷所佔的比例,尤其對於mic平台要開啟上百個執行緒,減少執行緒的開啟對效能影響更為重要;同時,隱藏了底層的執行緒互動,減少了不必要的同步帶來的損耗。
下面通過簡單的例子說明並行層級,例如程式中有兩層迴圈,並且每層迴圈都沒有資料依賴性,即兩層迴圈都可以並行,根據並行程式盡可能使用粗粒度的並行原則我們可以採用在i層迴圈並行的方式。
1.#pragma omp parallel for num_threads(thread_num)
2. for (i=0; i
3.
8. }
當然,並不是所有的應用程式都是在外層迴圈並行效果最佳,外層迴圈的並行可能會導致執行緒之間訪問的資料跨度比較大,可能會引起cache miss,這種情況下可能採取內層迴圈的並行效果更佳,同時為了減少執行緒的開銷,我們可以在外層for之前開啟多執行緒,在內層for進行任務分發,如上面的**採用下面的並行方式。
1#pragma omp parallel num_threads(thread_num)
2 for (i=0; i
3
9 }
在實際的應用程式中也可能出現某一層迴圈無法達到mic的並行度要求,針對這種情況,我們可以採取多層迴圈合併的方式。例如上面的**中m=20,n=30,無論我們並行哪層for都無法達到mic的並行度要求,我們可以合併兩層for,合併之後的迴圈次數為600次,顯然可以滿足mic平台上的要求。當然,我們也可以採用巢狀並行的方式滿足mic的並行度要求。
合併迴圈:
1#pragma omp parallel for num_threads(thread_num)
2 for (k=0; k
3
巢狀並行:
1omp_set_nested(true); //允許巢狀並行
2#pragma omp parallel for num_threads(thread_num1)
3 for (i=0; i
4
10 }
Spark 效能優化 調節並行度
並行度 spark 作業中,會根據 action 操作劃分成多個 job,每個 job 中會根據 shuffle 劃分成多個 stage,每個 stage 會分配多個 task 去執行,各個 stage 劃分的 task 數量就代表了 spark 作業在該 stage 的並行度。假設 spark 作...
GPU程式設計 四 並行規約優化
如果之前沒有用過gdb,可以速學一下,就幾個指令.想要用cuda gdb對程式進行除錯,首先你要確保你的gpu沒有在執行作業系統介面,比方說,我用的是ubuntu,我就需要用sudo service lightdm stop關閉圖形介面,進入tty1這種字元介面.當然用ssh遠端訪問也是可以的.接下...
程式優化之並行OpenMP
參考 1.openmp程式設計環境建立 project configuration property c c language openmp surport yes 2.include 3.迴圈並行化 pragma omp parallel for 4.資料環境,private shared,for...