我正在尝试以这种方式使用openmp添加数组的所有成员
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
int v[] ={1,2,3,4,5,6,7,8,9};
int sum = 0;
#pragma omp parallel private(v, sum)
{
#pragma reduction(+: sum)
{
for (int i = 0; i < sizeof(v)/sizeof(int); i++){
sum += v[i];
}
}
}
printf("%d\n",sum);
}
但是当我打印sum
时结果为0
答案 0 :(得分:1)
您对OpenMP的数据共享属性和工作共享非常困惑。这个答案不会试图正确地教给您,而只是给您一个简洁的具体例子。
您的代码没有任何意义,也无法编译。
您不需要多个区域或类似区域,并且只有两个变量。 v
-是在外部定义的,因此所有人都可以读取,并且必须为shared
-隐式是因为它是在外部定义的。然后是sum
,它是约简变量。
此外,您需要将工作共享(for
)应用于循环。所以最终看起来像这样:
int v[] ={1,2,3,4,5,6,7,8,9};
int sum = 0;
#pragma omp parallel for reduction(+: sum)
for (int i = 0; i < sizeof(v)/sizeof(int); i++){
sum += v[i];
}
printf("%d\n",sum);
请注意,此示例中有private
个变量。私有变量非常危险,因为它们在并行区域内未初始化,因此请不要显式使用它们。如果需要本地内容,请在并行区域内声明。