gpt4 book ai didi

c++ - 使用条件内循环的 OpenMP 调度是否仍然有效?

转载 作者:行者123 更新时间:2023-11-30 03:30:38 26 4
gpt4 key购买 nike

目前,在我代码的某个深处,我正在使用嵌套的 for 循环(N1=~10000,N2 = ~500,x,y= 10-50)。我使用了 #pragma omp,让 OpenMP 将我的计算分布在多个内核上。

#pragma omp parallel for
for (int i = 0; i < N1; ++i)
{
for (int j = 0; j < N2; ++j)
{
for (int k = x; k <= y; ++k)
{
// calculation
}
}
}

现在,我的两个内循环变成有条件的

#pragma omp parallel for
for (int i = 0; i < N1; ++i)
{
if (toExecute[i])
{
for (int j = 0; j < N2; ++j)
{
for (int k = x; k <= y; ++k)
{
// calculation
}
}
}
}

内部嵌套循环要么花费很长时间,要么立即完成。当然,我可以通过用更短的循环替换外循环和 if 语句来省略 if 语句,并为以后的索引查找。

我的问题是:OpenMP 是否足够智能以处理外循环中的 if 语句,还是我必须手动执行某些操作?

如果重要的话,我目前在 Visual Studio 2017 中使用 C++(我认为 OpenMP 版本有点落后)。

最佳答案

理想情况下,您应该让 OpenMP 为您处理。但一如既往,当你在做性能方面的事情时,你必须尝试找出最适合你的东西。事实上,您可以通过手动执行操作来获得极大的加速。 OpenMP 不是无所不知的,他不知道你计算的所有细节和智能。

如果您的计算意味着任何迭代的工作量相同,那么您的条件可能会导致最外层循环的一些不同工作负载。所以理论上,动态调度应该更合适#pragma omp parallel for schedule(dynamic)

您也可以尝试 staticguided 调度,这可能适合您的计算(我不知道您的计算细节,所以我不能说)并使用粒度 block 。

另一个要做的测试,如果你负担得起(即它是可并行化的吗?),你应该尝试在内部循环中移动并行化。您甚至可以嵌套并行化,它有时会提供很好的加速。一步一步地尝试和调整,花点时间看看什么能给你最好的输出。只是提醒您,这些调整通常在不同的架构中并不通用,因此要在性能和代码可重用性之间取得良好的权衡。

关于c++ - 使用条件内循环的 OpenMP 调度是否仍然有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44846807/

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