gpt4 book ai didi

c++ - 减少 OpenMP 并行迭代次数

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:44 26 4
gpt4 key购买 nike

我在 C++ 程序中有一个 parallel for,它必须循​​环到一定数量的迭代。每次迭代都会为算法计算一个可能的解决方案,一旦找到有效的解决方案,我就想退出循环(如果完成一些额外的迭代就可以了)。我知道迭代次数应该从 parallel for 开始就固定,但是由于我没有增加以下代码中的迭代次数,是否可以保证线程检查条件在继续他们当前的迭代之前?

void fun()
{
int max_its = 100;

#pragma omp parallel for schedule(dynamic, 1)
for(int t = 0; t < max_its; ++t)
{
...
if(some condition)
max_its = t; // valid to make threads exit the for?
}
}

最佳答案

修改循环计数器适用于大多数 OpenMP 工作共享结构的实现,但该程序将不再符合 OpenMP,并且不能保证该程序适用于其他编译器。

由于 OP 可以进行一些额外的迭代,OpenMP 取消将是可行的方法。 OpenMP 4.0 正是为此引入了“取消”结构。它将请求终止工作共享构造并将线程传送到它的末尾。

void fun()
{
int max_its = 100;

#pragma omp parallel for schedule(dynamic, 1)
for(int t = 0; t < max_its; ++t)
{
...
if(some condition) {
#pragma omp cancel for
}
#pragma omp cancellation point for
}
}

请注意,在性能方面可能需要付出代价,但如果中止循环时整体性能更好,您可能希望接受这一点。

在 OpenMP 4.0 之前的实现中,唯一符合 OpenMP 的解决方案是使用 if 语句尽快接近循环的常规结束而不执行实际的循环体:

void fun()
{
int max_its = 100;

#pragma omp parallel for schedule(dynamic, 1)
for(int t = 0; t < max_its; ++t)
{
if(!some condition) {
... loop body ...
}
}
}

希望对您有所帮助!

干杯, -迈克尔

关于c++ - 减少 OpenMP 并行迭代次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18825264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com