【问题标题】:OpenMP reduction with parallel task使用并行任务减少 OpenMP
【发布时间】:2019-04-27 12:47:37
【问题描述】:

我尝试使用并行任务来执行归约,但总是得到 0。这是我的代码:

int sum = 0;
#pragma omp parallel reduction(+:sum)
#pragma omp single
for(int i=0; i<10; i++)
{
    #pragma omp task
    {
        printf("Thread: %d\n", omp_get_thread_num());
        int y = 5;
        sum += y;
    }
}
printf("%d\n", sum);

但是当我使用parallel for时,结果是对的,是50。谁能告诉我如何修改并行任务代码? 这是我的并行代码,效果很好:

int sum = 0;
#pragma omp parallel for reduction(+:sum)
for(int i=0; i<10; i++)
{
    printf("Thread: %d\n", omp_get_thread_num());
    int y = 5;
    sum += y;
}
printf("%d\n", sum);

【问题讨论】:

    标签: c multithreading performance parallel-processing openmp


    【解决方案1】:

    dreamcrash 的答案是正确的。 OpenMP 5.0 添加了任务缩减支持,但 OpenMP 5.0 尚未得到广泛支持,afaik 只有英特尔编译器支持包含任务缩减的 OpenMP 5.0 预览版。

    如果您确实必须对 5.0 之前的 OpenMP 任务使用归约,您基本上可以将归约变量声明为 threadprivate 并按照this talk 中所述进行手动归约。

    看起来像这样:

    int sum = 0;
    int thread_sum = 0;
    #pragma omp threadprivate(sum)
    #pragma omp parallel
    {
        #pragma omp single
        for(int i=0; i<10; i++)
        {
            #pragma omp task
            {
                printf("Thread: %d\n", omp_get_thread_num());
                int y = 5;
                thread_sum += y;
            }
        }
        #pragma omp atomic
        sum += thread_sum
    }
    

    【讨论】:

      【解决方案2】:

      根据OpenMP standard 4.5,您不能减少任务构造函数中使用的变量。

      出现在最里面的归约子句中的列表项 封闭的工作共享或并行结构可能无法在 明确的任务。

      不过,OpenMP 5.0 似乎将涵盖该功能。无论如何,查看您的代码,更好的方法实际上是使用并行 for 和缩减子句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 2015-12-22
        相关资源
        最近更新 更多