如何在 OpenMP 的单线程块中声明共享工作区?
How to declare a shared-working work region within a single-threaded block in OpenMP?
我正在尝试使用 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
并放弃主循环之外的分支之外,是否有任何解决方案?
如果不够清楚,请告诉我。
提前致谢
是的,像这样并行化内部循环
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 并行化内循环的示例。
我正在尝试使用 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
并放弃主循环之外的分支之外,是否有任何解决方案?
如果不够清楚,请告诉我。
提前致谢
是的,像这样并行化内部循环
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 并行化内循环的示例。