我一直在尝试自学OpenMP,事实上我今天从一些例子开始。我尝试通过制作一个程序来扩展其中一个示例,该程序可以从2d数组中选出最高数字,最低数字,它们的坐标和所有元素的总值。
以下是代码的摘录:
#pragma omp parallel for reduction(+:total) reduction(max : max) reduction (min : min) private(j)
for( i=0;i<size; i++){
for(j=0; j<size;j++){
total += arr[i][j];
if(arr[i][j] > max){
#pragma omp critical
{
if(arr[i][j] > max){
max=arr[i][j];
maxX=i;
maxY=j;
}
}
}
if(arr[i][j] < min){
#pragma omp critical
{
if(arr[i][j] < min){
min=arr[i][j];
minX=i;
minY=j;
}
}
}
}
}
唯一似乎错误的是坐标maxX
,maxY
,minX
和minY
。从执行到执行(超过1个线程),它们的值会发生变化,有时会给出正确答案,但大多数情况下都没有。
我需要对这些变量做些什么才能做到这一点?