Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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/2/.net/24.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++ 标量代码和并行代码之间的不同行为_C++_C_Parallel Processing_Openmp_Schedule - Fatal编程技术网

C++ 标量代码和并行代码之间的不同行为

C++ 标量代码和并行代码之间的不同行为,c++,c,parallel-processing,openmp,schedule,C++,C,Parallel Processing,Openmp,Schedule,我想知道为什么下面的代码在标量和并行变量中产生不同的结果: #define N 10 double P[N][N]; // zero the matrix just to be sure... for (int i=0; i<N; i++) for(int j=0; j<N; j++) P[i][j]=0.0; double xmin=-5.0,ymin=-5.0,xmax=5.0,ymax=5.0; double x=xmin,y=ymin; doubl

我想知道为什么下面的代码在标量和并行变量中产生不同的结果:

#define N 10
double P[N][N];
// zero the matrix just to be sure...
for (int i=0; i<N; i++)
    for(int j=0; j<N; j++)
        P[i][j]=0.0;


double xmin=-5.0,ymin=-5.0,xmax=5.0,ymax=5.0;
double x=xmin,y=ymin;
double step= abs(xmax-xmin)/(double)(N - 1 );
for (int i=0; i<N; i++)
{
    #pragma omp parallel for ordered schedule(dynamic)
    for ( int j=0; j<N; j++)
    {
        x = i*step+xmin;
        y = j*step+ymin;
        P[i][j]=x+y;
    }
}
#定义N 10
双P[N][N];
//将矩阵归零以确保。。。

对于(int i=0;i啊,现在我可以看到问题了。你的评论没有足够的上下文让我看到它。但是现在它清楚了

问题在于:

    x = i*step+xmin;
    y = j*step+ymin;
x
y
是在并行区域之外声明的,因此它们在所有线程之间共享。(因此,所有线程之间都存在严重的争用情况…)

要解决此问题,请将其设置为本地:

for ( int j=0; j<N; j++)
{
    double x = i*step+xmin;
    double y = j*step+ymin;
    P[i][j]=x+y;
}

for(int j=0;jyeah,修复了!现在它与外部循环中的
#pragma
一起工作!谢谢!还有第二种可能可以保证x,y是线程本地的。您可以在pragma中使用or关键字:
#pragma omp parallel for ordered schedule(dynamic)private(x,y)
@linello,我认为这个答案值得打绿色记号!