使用openmp没有结果

时间:2018-10-20 16:44:33

标签: c openmp

我正在尝试以这种方式使用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

1 个答案:

答案 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个变量。私有变量非常危险,因为它们在并行区域内未初始化,因此请不要显式使用它们。如果需要本地内容,请在并行区域内声明。