Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确并行化嵌套for循环_C++_C_For Loop_Nested_Openmp - Fatal编程技术网

C++ 如何正确并行化嵌套for循环

C++ 如何正确并行化嵌套for循环,c++,c,for-loop,nested,openmp,C++,C,For Loop,Nested,Openmp,我正在使用OpenMP并行化一个标量嵌套for循环: double P[N][N]; double x=0.0,y=0.0; for (int i=0; i<N; i++) { for (int j=0; j<N; j++) { P[i][j]=someLongFunction(x,y); y+=1; } x+=1; } double P[N][N]; 双x=0.0,y=0.0; 对于(int i=0;i而言,这里的

我正在使用OpenMP并行化一个标量嵌套for循环:

double P[N][N];
double x=0.0,y=0.0;

for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction(x,y);
        y+=1;
    }
    x+=1;
}
double P[N][N];
双x=0.0,y=0.0;

对于(int i=0;i而言,这里的问题是您已使用以下项将迭代添加到迭代依赖项中:

x+=1;
y+=1;
因此,就目前的代码而言,它是不可并行的。尝试这样做将导致不正确的结果。(正如您可能看到的)

幸运的是,在您的情况下,您可以直接计算它们,而不引入这种依赖关系:

for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction((double)i, (double)N*i + j);
    }
}

for(int i=0;谢谢你的回答。我能再问你一个问题吗?如果我想在内环之前每次y=0都重置怎么办?openmp实现将如何更改?然后将
(double)N*i+j
更改为
(double)j
。这里的关键是我导出了
x
y
的表达式,作为循环索引的函数。这可以让你打破依赖关系。多亏了你的回答,他们向我阐明了如何解开循环,为OpenMP并行化做好准备。最后一个问题,为什么要使用串行和并行版本e给我一小部分不同的元素?
for(int i=0;iIt不应该不同,除非你在某个地方有bug。你可能想把它作为一个单独的问题发布。另外两件事:1)我不太熟悉
ordered
指令,但我认为你使用它的方式可能会弄巧成拙。2)如果可能,并行化外环而不是内环。
#pragma omp parallel for
for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction((double)i, (double)N*i + j);
    }
}