工作共享構造 - For 迴圈的示例
double res[MAX]; int i;
#pragma omp parallel
{
#pragma omp for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
}
for 迴圈將並行執行。huge()
是一種可能需要很長時間才能執行的方法。OpenMP 支援將上述程式碼編寫為的快捷方式:
double res[MAX]; int i;
#pragma omp parallel for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
我們還可以有一個 schedule 子句,它影響迴圈迭代如何對映到執行緒。例如:
#pragma omp parallel
#pragma omp for schedule(static)
for(i=0;I<N;i++) {
a[i] = a[i] + b[i];
}
不同風格的排程是:
schedule(static [,chunk])
對每個執行緒執行大小 chunk
的迭代塊。
如果未指定:儘可能均勻地分配給可用執行緒
schedule(dynamic [,chunk])
每個執行緒從佇列中抓取塊迭代,直到所有迭代都被處理完畢。
schedule(guided [,chunk])
執行緒動態地抓取迭代塊。隨著計算的進行,塊的大小開始變大並縮小到塊大小。
schedule(執行時)
從 OMP_SCHEDULE 環境變數獲取的計劃和塊大小。