何时工作共享构造内部关键构造在 OpenMP 中有用?
When Worksharing Constructs Inside a critical Construct is useful in OpenMP?
在OpenMP示例中可以找到以下代码6.2 Worksharing Constructs Inside a critical Construct:
void critical_work()
{
int i = 1;
#pragma omp parallel sections
{
#pragma omp section
{
#pragma omp critical (name)
{
#pragma omp parallel
{
#pragma omp single
{
i++;
}
}
}
}
}
}
你用过这种结构吗?在现实生活中什么情况下才是最好的选择?我唯一的猜测是它在错误处理中很有用,还有什么?
我认为这个具体的例子只是说明这种代码仍然符合标准。
如果问题只是关于在关键构造内(在工作共享构造内)有一个工作共享构造,我可以粗略地想象分层应用程序,其中通常有两层嵌套的 OpenMP 并行性,但大多数工作是在关键区域之外完成的,例如:
void mostly_uncritical_work()
{
#pragma omp parallel
{
#pragma omp parallel
{
/* main workload */
}
#pragma omp critical (name)
{
#pragma omp parallel
{
/* smaller amount of work but still big enough */
/* to profit from parallelization */
}
}
}
}
所以最后问题归结为“是否有嵌套 OpenMP 并行性的应用程序?”我的回答肯定是肯定的。例如,我使用它在外部团队中有一个由 2 个线程组成的团队,其中一个在 GPU 上模拟事物,另一个使用内部线程团队分析 GPU 的输出。
在OpenMP示例中可以找到以下代码6.2 Worksharing Constructs Inside a critical Construct:
void critical_work()
{
int i = 1;
#pragma omp parallel sections
{
#pragma omp section
{
#pragma omp critical (name)
{
#pragma omp parallel
{
#pragma omp single
{
i++;
}
}
}
}
}
}
你用过这种结构吗?在现实生活中什么情况下才是最好的选择?我唯一的猜测是它在错误处理中很有用,还有什么?
我认为这个具体的例子只是说明这种代码仍然符合标准。 如果问题只是关于在关键构造内(在工作共享构造内)有一个工作共享构造,我可以粗略地想象分层应用程序,其中通常有两层嵌套的 OpenMP 并行性,但大多数工作是在关键区域之外完成的,例如:
void mostly_uncritical_work()
{
#pragma omp parallel
{
#pragma omp parallel
{
/* main workload */
}
#pragma omp critical (name)
{
#pragma omp parallel
{
/* smaller amount of work but still big enough */
/* to profit from parallelization */
}
}
}
}
所以最后问题归结为“是否有嵌套 OpenMP 并行性的应用程序?”我的回答肯定是肯定的。例如,我使用它在外部团队中有一个由 2 个线程组成的团队,其中一个在 GPU 上模拟事物,另一个使用内部线程团队分析 GPU 的输出。