背景:OpenMP的V4 +英特爾的編譯器ICC]並行「任務的內線已經並行for循環OpenMP中
我想並行化已經是一個並行循環內的任務。我看見科目接近這一個,例如:
- Parallel sections in OpenMP using a loop
- Doing a section with one thread and a for-loop with multiple threads
- 和others更集中智慧,還有不少疑問。
但是在嘗試它時,除了編譯時錯誤消息,我無法得到明確的答案。
代碼:
#pragma omp parallel for private(a,bd) reduction(+:sum)
for (int i=0; i<128; i++) {
a = i%2;
for (int j=a; j<128; j=j+2) {
u_n = 0.25 * (u[ i*128 + (j-3) ]+
u[ i*128 + (j+3) ]+
u[ (i-1)*128 + j ]+
u[ (i+1)*128 + j ]);
// #pragma omp single nowait
// {
// #pragma omp task shared(sum1) firstprivate(i,j)
// sum1 = (u[i*128+(j-3)]+u[i*128+(j-2)] + u[i*128+(j-1)])/3;
// #pragma omp task shared(sum2) firstprivate(i,j)
// sum2 = (u[i*128+(j+3)]+u[i*128+(j+2)]+u[i*128+(j+1)])/3;
// #pragma omp task shared(sum3) firstprivate(i,j)
// sum3 = (u[(i-1)*128+j]+u[(i-2)*128+j]+u[(i-3)*128+j])/3;
// #pragma omp task shared(sum4) firstprivate(i,j)
// sum4 = (u[(i+1)*128+j]+u[(i+2)*128+j]+u[(i+3)*128+j])/3;
// }
// #pragma omp taskwait
// {
// u_n = 0.25*(sum1+sum2+sum3+sum4);
// }
bd = u_n - u[i*128+ j];
sum += diff * diff;
u[i*128+j]=u_n;
}
}
在上面的代碼中,我試圖替換u_n = 0.25 *(...);
符合15註釋行,不僅嘗試通過2個for
循環來paralllelize迭代,而且還acheive一定程度在涉及數組u[]
的4次計算(sum1
到sum4
)中的每一次計算上都是並行性的。
編譯錯誤是相當明確的:
error: the OpenMP "single" pragma must not be enclosed by the "parallel for" pragma
有沒有解決的辦法,所以我可以進一步優化該計算使用OpenMP?
謝謝佐蘭。Yr解釋肯定會擊敗編譯時錯誤信息。根據你的指針,我將在我的集羣上查看測量儀器。乾杯, – Cbhihe