我制作了這個并行代碼來共享迭代,例如 first 和 last、first 1 和 last-1,...但我不知道如何改進兩個并行部分中的每一個的代碼,因為我有一個內部回圈在這些部分中,我想不出任何方法來簡化它,謝謝。
這不是關于哪些值存盤在 x 或 y 中,我使用此部分設計,因為必要條件是執行從 0 到 N 的迭代,例如:0 N, 1 N-1, 2 N-2 但我想知道如果我可以優化維護這個模型的內部回圈
int x = 0, y = 0,k,i,j,h;
#pragma omp parallel private(i, h) reduction( :x, y)
{
#pragma omp sections
{
#pragma omp section
{
for (i=0; i<N/2; i )
{
C[i] = 0;
for (j=0; j<N; j )
{
C[i] = MAT[i][j] * B[j];
}
x = C[i];
}
}
#pragma omp section
{
for (h=N-1; h>=N/2; h--)
{
C[h] = 0;
for (k=0; k<N; k )
{
C[h] = MAT[h][k] * B[k];
}
y = C[h];
}
}
}
}
x = x y;
uj5u.com熱心網友回復:
使用部分似乎是錯誤的方法。Apragma omp for似乎更合適。另請注意,您忘記宣告j私有。
int x = 0, y = 0,k,i,j;
#pragma omp parallel private(i,j) reduction( :x, y)
{
# pragma omp for nowait
for(i=0; i<N/2; i ) {
// local variable to make the life easier on the compiler
int ci = 0;
for(j=0; j<N; j )
ci = MAT[i][j] * B[j];
x = ci;
C[i] = ci;
}
# pragma omp for nowait
for(i=N/2; i < N; i ) {
int ci = 0;
for(j=0; j<N; j )
ci = MAT[i][j] * B[j];
y = ci;
C[i] = ci;
}
}
x = x y;
另外,我不確定,但如果您只想x作為最終輸出,您可以進一步簡化代碼:
int x=0, i, j;
#pragma omp parallel for reduction( :x) private(i,j)
for(i=0; i < N; i)
for(j=0; j < N; j)
x = MAT[i][j] * B[j];
uj5u.com熱心網友回復:
節構造是將不同的任務分配給不同的執行緒,每個節塊標記一個不同的任務,因此您將無法按照您希望的順序進行迭代,我在這里回答您:
具有特定順序的執行緒之間的回圈迭代分布
但我想澄清一下,使用節的要求是每個塊必須獨立于其他塊。
uj5u.com熱心網友回復:
一個部分只有一個執行緒,所以你不能使回圈平行。怎么樣
N在頂層做一個并行回圈,- 然后在每次迭代內部使用一個條件來決定是否累積成
x,y?
盡管@Homer512 的解決方案對我來說也是正確的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399164.html
