c-openmp中带有嵌套循环的并行部分代码



我制作了这个并行代码来共享迭代,比如first和last,first+1和last1,。。。但我不知道如何改进两个并行部分中的每一个部分的代码,因为这些部分中有一个内部循环,我想不出任何方法来简化它,谢谢。

这不是关于哪些值存储在x或y中,我使用这个部分的设计,因为必要的是执行从0到N的迭代,比如:0N,1N-1,2N-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;

使用节似乎是错误的方法。pragma 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];

节结构是将不同的任务分配给不同的线程,每个节块标记一个不同的任务,因此您将无法按照您想要的顺序进行迭代。我在这里回答了您:

具有特定顺序的线程之间循环迭代的分布

但我想澄清的是,使用节的要求是每个块必须独立于其他块。

一个部分只有一个线程,所以不能使循环并行。怎么样

  1. 在顶层对CCD_ 4进行并行循环
  2. 则在每次迭代中使用条件来决定是否累积到CCD_ 5

尽管@Homer512的解决方案在我看来也是正确的。

最新更新