對於記憶體利用比較好的情況下,對於負載平衡可能是不利的;同樣,有利於負載平衡的策略也有可能對訪存的效能不利。因此,在對效能優化時,必須在優化記憶體利用和優化負載平衡之間進行折中,通過對效能的測量找到能夠得到最佳結果的方法。
在openmp for結構中,使用schedule子句將迴圈排程和分開資訊傳達給編譯器和執行時庫:
#pragma omp for schedule (kind [, chunk-size])
如果指定可選的chunk-size(塊大小),則該引數必須是不隨迴圈變化的正整數常量或整數表示式。
(注:調整塊大小時要特別注意,因為它可能對效能帶來負面影響。隨著塊大小的減小,執行緒用於從任務佇列中獲取任務的時間增加,結果使訪問任務佇列的開銷增加,而降低效能,並有可能抵消負載平衡帶來的效能提公升。
openmp的四種排程方案
排程型別
描述static( 預設不指定塊大小)
將所有迴圈劃分成大小相等的塊,或在迴圈迭代次數不能整除執行緒數與塊大小的乘積時劃分成盡可能相等大小的塊。
dynamic
使用乙個內部佇列,當執行緒可用時,為其分配由塊大小所指定的一定數量的迴圈迭代。執行緒完成分配後,將從任務佇列頭取出下一組迭代。塊預設大小為1.
(注:這種排程需要額外的開銷)
guided
與dynamic類似,但塊大小剛開始較大,然後逐漸減少,從而減少了執行緒用於訪問任務佇列的時間。(chunk可指定所使用的塊大小的最小值,預設為1)
runtime
在執行時使用omp_schedule環境變數來確定使用上述三種排程策略中的某一種。
more:
《多核程式設計》,
openmp中的任務排程:
OpenMP中的任務迴圈排程和分塊
對於記憶體利用比較好的情況下,對於負載平衡可能是不利的 同樣,有利於負載平衡的策略也有可能對訪存的效能不利。因此,在對效能優化時,必須在優化記憶體利用和優化負載平衡之間進行折中,通過對效能的測量找到能夠得到最佳結果的方法。在openmp for結構中,使用schedule子句將迴圈排程和分開資訊傳達...
OpenMP中的任務排程
openmp中,任務排程主要用於並行的for迴圈中,當迴圈中每次迭代的計算量不相等時,如果簡單地給各個執行緒分配相同次數的迭代的話,會造成各個執行緒計算負載不均衡,這會使得有些執行緒先執行完,有些後執行完,造成某些cpu核空閒,影響程式效能。例如以下 int i,j int a 100 100 fo...
OpenMP中的任務排程
openmp中的任務排程 openmp中,任務排程主要用於並行的for迴圈中,當迴圈中每次迭代的計算量不相等時,如果簡單地給各個執行緒分配相同次數的迭代的話,會造成各個執行緒計算負載不均衡,這會使得有些執行緒先執行完,有些後執行完,造成某些cpu核空閒,影響程式效能。例如以下 int i,j int...