如何使用 OpenMP 为每个函数分配不同数量的线程
How to assign different number of threads to each functions using OpenMP
我有两个函数,第二个函数中有一个 for 循环。
fun1() {
...
}
fun2() {
for(...) {
}
}
现在我想 运行 fun1
和 fun2
并行(即每个函数使用一个线程)。在 fun2
里面,我希望我可以使用 omp parallel for
来执行 for 循环。
我试过这样实现的。
fun1() {
}
fun2() {
#pragma omp for
for() {
}
}
int main() {
#pragma omp parallel
{
#pragma omp single
{
fun1();
}
fun2();
{
}
但它会多次调用 fun2
。
那么有办法做到这一点吗?
您应该结合使用 OpenMP 部分和嵌套并行性:
在main
中:
omp_set_nested(1);
#pragma omp parallel sections num_threads(2)
{
#pragma omp section
fun1();
#pragma omp section
fun2();
}
在fun2
中:
#pragma omp parallel for
for (...)
{
}
运行 您的程序,例如8 个线程,做这样的事情:
OMP_NUM_THREADS=8 OMP_THREAD_LIMIT=8 ./program
这样,外部并行区域将使用两个线程执行,而 fun2
中的嵌套并行区域将使用七个线程执行。如果 OMP_THREAD_LIMIT
未设置为 8(或未设置),OpenMP 将为嵌套区域启动八个线程,总共九个线程,这可能是理想的,也可能不是。
我有两个函数,第二个函数中有一个 for 循环。
fun1() {
...
}
fun2() {
for(...) {
}
}
现在我想 运行 fun1
和 fun2
并行(即每个函数使用一个线程)。在 fun2
里面,我希望我可以使用 omp parallel for
来执行 for 循环。
我试过这样实现的。
fun1() {
}
fun2() {
#pragma omp for
for() {
}
}
int main() {
#pragma omp parallel
{
#pragma omp single
{
fun1();
}
fun2();
{
}
但它会多次调用 fun2
。
那么有办法做到这一点吗?
您应该结合使用 OpenMP 部分和嵌套并行性:
在main
中:
omp_set_nested(1);
#pragma omp parallel sections num_threads(2)
{
#pragma omp section
fun1();
#pragma omp section
fun2();
}
在fun2
中:
#pragma omp parallel for
for (...)
{
}
运行 您的程序,例如8 个线程,做这样的事情:
OMP_NUM_THREADS=8 OMP_THREAD_LIMIT=8 ./program
这样,外部并行区域将使用两个线程执行,而 fun2
中的嵌套并行区域将使用七个线程执行。如果 OMP_THREAD_LIMIT
未设置为 8(或未设置),OpenMP 将为嵌套区域启动八个线程,总共九个线程,这可能是理想的,也可能不是。