C++ OpenMP“;大师;pragma不能包含在“";平行于;布拉格马

C++ OpenMP“;大师;pragma不能包含在“";平行于;布拉格马,c++,com,callback,progress-bar,openmp,C++,Com,Callback,Progress Bar,Openmp,为什么英特尔编译器不允许我指定openmp并行for块中的某些操作只应由主线程执行 如果没有这种功能,我该如何实现我想要实现的目标呢 我尝试通过回调并行更新进度条,用于: long num_items_computed = 0; #pragma omp parallel for schedule (guided) for (...a range of items...) { //update item count #pragma omp atomic num_i

为什么英特尔编译器不允许我指定openmp
并行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.
…因此希望将所有回调保留在主线程中


提前感谢。

出现错误的原因是,代码到达
#pragma omp master
行时,主线程大部分时间不在那里。
#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;
}
例如,让我们以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;
}
#包括
void f(){}
int main()
{
#计划的pragma omp并行(引导式)
对于(int i=0;i<100;++i)
{ 
#pragma-omp-master
f();
}
返回0;
}
如果要编译代码,可能会发生以下情况:

假设线程0启动(主线程)。它到达了实际上说“大师,做下面的代码”的pragma。如果是主控,则可以运行该功能。 然而,当线程1、2或3等到达该代码段时会发生什么

master指令告诉present/listening团队,主线程必须执行
f()
。但是团队是一个单一的线程,没有大师在场。程序不知道过了那一点该怎么办

这就是为什么,我认为,主控不允许在for循环中


主指令
替换为
if(omp\u get\u thread\u num()==0)
有效,因为现在程序会说,“如果您是主指令,请执行此操作。否则忽略”

这似乎起作用了,谢谢。我担心主线程可能与所有工作线程不同。。。所以回调永远不会执行。。。这在omp规范中是可以想象的吗?如果迭代次数很大,那么您不会注意到差异。循环添加后:if(omp\u get\u thread\u num()==0)set\u progressor\u callback(num\u items\u computed);从standart OpenMP关于pragma omp parallel for():“循环构造指定一个或多个关联循环的迭代将由团队中的线程在其隐式任务的上下文中并行执行。迭代分布在执行循环区域绑定到的并行区域的团队中已经存在的线程之间
#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;
}