我尝试使用OpenMP为具有以下方案的函数编写并行代码:
1. Begin of data-dependent loop
2. Some computation
3. If the result of 2 equals 0 then
3.1. Begin of data-independent loop
3.2. Some computation
3.3. End of data-independent loop
4. Some computation by a single thread
5. Begin of data-independent loop
6. Some computation
7. End of data-independent loop
8. End of data-dependent loop
问题是 - 我想用以下内容附上区域:
#pragma omp parallel
1. Begin of data-dependent loop
#pragma omp master
2. Some computation by a single thread
3. If the result of 2 equals 0 then
#pragma omp for
3.1. Begin of data-independent loop
3.2. Some computation
3.3. End of data-independent loop
4. Some computation by a single thread
#pragma omp for
5. Begin of data-independent loop
6. Some computation
7. End of data-independent loop
8. End of data-dependent loop
但是,编译器不允许我将pragma omp for
与pragma omp master
嵌套。有没有解决方法,除了将它们更改为pragma omp parallel for
并放弃主循环之外的分支?
如果它不够清楚,请告诉我。
提前致谢
答案 0 :(得分:1)
是的,只需像这样内联循环内部循环
for(int i=0; i<n; i++) {
cut = foo(i);
if(!cut) {
#pragma omp parallel for
for(int j=0; j<m; j++) {
//
}
}
foo2();
#pragma omp parallel for
for(int j=0; j<k; j++) {
//
}
}
这是有效的,因为OpenMP的实现在它第一次调用时创建了一个线程池,可用于下一个并行区域,即线程不会在并行区域之间创建和销毁。这是我认为使用OpenMP的一个很好的功能。使用例如创建玩具OpenMP模型非常容易。 pthreads和实现静态调度但是创建线程池更加困难。请注意,没有什么需要OpenMP来创建池,但我使用它的每个实现都是这样做的。
请参阅 cholesky-decomposition-with-openmp示例并行化内部循环。