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
?我想这可能有助于您了解各节和任务之间的差异。