OpenMP“master”编译指示不能被“parallel for”pragma包围

时间:2011-10-05 12:12:22

标签: c++ com callback progress-bar openmp

为什么intel编译器不允许我指定openmp parallel for块中的某些操作只能由主线程执行?

如果没有这种功能,我怎么能做到我想要实现的目标呢?

我要做的是通过并行回调更新进度条:

long num_items_computed = 0;

#pragma omp parallel for schedule (guided)
for (...a range of items...)
{
    //update item count
    #pragma omp atomic
        num_items_computed++;

    //update progress bar with number of items computed
    //master thread only due to com marshalling
    #pragma omp master
        set_progressor_callback(num_items_computed);

    //actual computation goes here
    ...blah...
}

我只希望主线程调用回调,因为如果我不强制执行(比如使用omp critical而不是确保只有一个线程一次使用回调),我会得到以下运行时异常:

The application called an interface that was marshalled for a different thread.

...因此希望将所有回调保留在主线程中。

提前致谢。

2 个答案:

答案 0 :(得分:6)

#include <omp.h>
void f(){}
int main()
{
#pragma omp parallel for schedule (guided)
    for (int i = 0; i < 100; ++i)
    {
        #pragma omp master
        f();
    }
    return 0;
}

编译器错误C3034 OpenMP'master'指令不能直接嵌套在'parallel for'指令中 Visual Studio 2010 OpenMP 2.0

可能是这样:

long num_items_computed = 0;

#pragma omp parallel for schedule (guided)
for (...a range of items...)
{
    //update item count
    #pragma omp atomic
        num_items_computed++;

    //update progress bar with number of items computed
    //master thread only due to com marshalling
    //#pragma omp master it is error
    //#pragma omp critical it is right
    if (omp_get_thread_num() == 0) // may be good
        set_progressor_callback(num_items_computed);

    //actual computation goes here
    ...blah...
}

答案 1 :(得分:3)

您收到错误的原因是,当代码到达#pragma omp master行时,大多数情况下主线程都不存在。 例如,让我们从Artyom中获取代码:

#include <omp.h>
void f(){}
int main()
{
#pragma omp parallel for schedule (guided)
    for (int i = 0; i < 100; ++i)
    { 
        #pragma omp master
            f();
    }
    return 0;
}

如果代码编译,可能会发生以下情况:

假设线程0开始(主线程)。它达到了实际上说“掌握,做下面一段代码”的实用主义。它是主人可以运行的功能。 但是,当线程1或2或3等到达那段代码时会发生什么?

master指令告诉 present / listening 团队主线程必须执行f()。但团队是单线程,没有主人在场。该计划不知道该过去该做什么。

这就是为什么我认为主人不允许进入for-loop。

master directive代替if (omp_get_thread_num() == 0),因为现在程序说“如果你是主人,那就去做吧。否则忽略”。