C++ OpenMP中单节指令和节指令之间的差异

C++ OpenMP中单节指令和节指令之间的差异,c++,multithreading,parallel-processing,openmp,directive,C++,Multithreading,Parallel Processing,Openmp,Directive,据我所知, 我可以使用single指令执行与使用sections相同的工作,只需添加nowait标志即可 与部分指令相比,以下代码对我来说没有什么不同: void main(){ #pragma omp parallel { int tid = omp_get_thread_num(); #pragma omp single nowait { printf("Thread %d

据我所知, 我可以使用
single
指令执行与使用
sections
相同的工作,只需添加
nowait
标志即可

部分
指令相比,以下代码对我来说没有什么不同:

    void main(){
    #pragma omp parallel
        {
            int tid = omp_get_thread_num();
    #pragma omp single nowait
            {
                printf("Thread %d in #1 single construct.\n", tid);
            }
    #pragma omp single nowait
            {
                printf("Thread %d in #2 single construct.\n", tid);
            }
    #pragma omp single nowait
            {
                printf("Thread %d in #3 single construct.\n", tid);
            }
        }
    }

任何人都可以给我一些在不同场景中使用
部分
单个
指令的示例吗?

在某些情况下,
单个nowait
构造的行为可能与
部分
构造的行为相同。但是,OpenMP规范只要求只有一个线程执行单个构造。它不要求空闲线程采用其他后续构造。对于所有OpenMP实现,您不能简单地依赖此行为。大多数人会做你期望的事,但没有保证

另一件值得一提的事情是,大多数实现都使用票务系统将
单个
区域分配给线程。
区段
的常见代码转换是映射到
for
工作共享构造,方法是将区段构造转换为
for
循环,并对
区段
构造使用
开关
语句。因此,对执行有更多的保证

干杯,
-michael

首先,当涉及到阅读代码和使用一个指令来模仿另一个指令时,
单个指令
部分
指令具有明显不同的语义目的,这可能会产生严重的误导

关于技术细节,
single
是唯一支持
copyprivate
条款的工作共享指令,该条款:

。。。提供使用私有变量的机制 将值从一个隐式任务的数据环境广播到 属于的其他隐式任务的数据环境 平行区域

另一方面,
工作共享构造支持
lastprivate
reduce
子句,而
single
则不支持

最后,请注意您的代码片段:

#pragma omp single nowait
        {
            printf("Thread %d in #1 single construct.\n", tid);
        }
#pragma omp single nowait
        {
            printf("Thread %d in #2 single construct.\n", tid);
        }
#pragma omp single nowait
        {
            printf("Thread %d in #3 single construct.\n", tid);
        } // No barrier here

不模拟
,而是模拟
节nowait
。要模拟
部分
必须记住最后一个
单个
构造保持其隐式屏障。

我说的对吗,即使在
部分
中,规范也不要求空闲线程承担其他后续构造?(有关我的意思的更广泛的解释,请参见,即计划是由实施定义的)您是对的。如果有较少的部分有线程,一些可能会保持空闲。使用上面的单一模式,技术上只能执行一个线程,尽管有几个区域可以并行运行。如果我想创建一个任务管理器函数,我应该选择哪个指令?@CharlesChow我不理解你所说的“任务管理器函数”是什么意思。如果您想使用任务级并行,OpenMP 3.X和4.0支持
任务
指令。我指的是注册新任务并将每个任务分配给线程的程序。您提到我应该为单个指令留下一个障碍,这是否意味着我只是在
single
的最后一节中删除了
nowait
?我想这可能有助于您了解各节和任务之间的差异。