抱歉,如果标题不清楚。我完全不知道该怎么说这个。
我想知道是否有任何方法可以做到以下几点:
#pragma omp parallel
{
for (int i = 0; i < iterations; i++) {
#pragma omp for
for (int j = 0; j < N; j++)
// Do something
}
}
忽略诸如在 for 循环中省略私有说明符之类的事情,有什么方法可以在我的外循环之外分叉线程,以便我可以并行化内循环?根据我的理解(如果我错了,请纠正我),所有线程都将执行外循环。我不确定内部循环的行为,但我认为for
会将块分配给遇到它的每个线程。
我想要做的不是分叉/加入iterations
时间,而只需在外循环中执行一次。这是正确的策略吗?
如果有另一个不应该并行化的外部循环怎么办?那是...
#pragma omp parallel
{
for (int i = 0; i < iterations; i++) {
for(int k = 0; k < innerIterations; k++) {
#pragma omp for
for (int j = 0; j < N; j++)
// Do something
// Do something else
}
}
}
如果有人向我指出一个使用 OpenMP 并行化的大型应用程序的示例,那就太好了,这样我就可以更好地理解使用 OpenMP 时采用的策略。我似乎找不到任何东西。
澄清:我正在寻找不改变循环顺序或涉及阻塞、缓存和一般性能考虑的解决方案。我想了解如何在 OpenMP 中按照指定的循环结构完成此操作。可能有// Do something
也可能没有依赖关系,假设它们有并且你不能移动东西。