抱歉,如果标题有点不清楚。我不太知道该怎么表达。
我想知道是否有任何方法可以做到以下几点:
#pragma omp parallel
{
for (int i = 0; i < iterations; i++) {
#pragma omp for
for (int j = 0; j < N; j++)
// Do something
}
}
忽略在for循环中省略私有限定符等内容,是否有办法可以在外部循环之外分叉线程,以便只并行化内部循环?据我了解(如有错误请纠正),所有线程都将执行外部循环。我对内部循环的行为不确定,但我认为 for
会将块分配给遇到它的每个线程。
我想做的是不必对迭代进行fork/join操作,而只需在外部循环中执行一次即可。这是正确的策略吗?
如果还有另一个不应并行化的外部循环呢?也就是说...
#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
可能有依赖关系,假设它们存在并且您不能移动它们。