OpenMP, for loop inside section

匿名 (未验证) 提交于 2019-12-03 01:39:01

问题:

I would like to run the following code (below). I want to spawn two independent threads, each one would run a parallel for loop. Unfortunately, I get an error. Apparently, parallel for cannot be spawned inside section. How to solve that?

#include  #include "stdio.h"  int main() {  omp_set_num_threads(10);  #pragma omp parallel     #pragma omp sections   { #pragma omp section #pragma omp for     for(int i=0; i<5; i++) {         printf("x %d\n", i);     }  #pragma omp section #pragma omp for     for(int i=0; i<5; i++) {         printf(". %d\n", i);     }   } // end parallel and end sections }

And the error:

main.cpp: In function int main()’: main.cpp:14:9: warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region [enabled by default] main.cpp:20:9: warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region [enabled by default]

回答1:

OpenMP cannot create parallel regions inside parallel regions. This is due to the fact that OpenMP create at the beginning of the program num_threads parallel threads, in non parallel regions the others are not used and sleep. They have done this, as the frequent generation of new threads is quite slow compared to waking sleeping threads.

Therefore you should parallelize only the loops:

#include  #include "stdio.h"  int main() {  omp_set_num_threads(10);  #pragma omp parallel for     for(int i=0; i<5; i++) {         printf("x %d\n", i);     }  #pragma omp parallel for     for(int i=0; i<5; i++) {         printf(". %d\n", i);     } }


回答2:

Here you have to use nested parallelism. The problem with the omp for in the sections is that all the threads in scope have to take part in the omp for, and they clearly don't ― they're broken up by sections. So you have to introduce functions, and do nested paralleism within the functions.

#include  #include   void doTask1(const int gtid) {     omp_set_num_threads(5); #pragma omp parallel      {         int tid = omp_get_thread_num();         #pragma omp for         for(int i=0; i<5; i++) {             printf("x %d %d %d\n", i, tid, gtid);         }     } }  void doTask2(const int gtid) {     omp_set_num_threads(5); #pragma omp parallel      {         int tid = omp_get_thread_num();         #pragma omp for         for(int i=0; i<5; i++) {             printf(". %d %d %d\n", i, tid, gtid);         }     } }   int main() {     omp_set_num_threads(2);     omp_set_nested(1);  #pragma omp parallel         {         int gtid = omp_get_thread_num(); #pragma omp sections         { #pragma omp section             doTask1(gtid);  #pragma omp section             doTask2(gtid);         }  
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!