首页 > 解决方案 > “omp parallel for”在“omp parallel”中不起作用

问题描述

我希望得到以下输出:

My rank is: 0 num is: 0
My rank is: 1 num is: 1
My rank is: 2 num is: 2
My rank is: 3 num is: 3

从以下代码:

#pragma omp parallel
{
   int my_rank = omp_get_thread_num();

   #pragma omp parallel for num_threads(4)
   for(int i = 0; i < 4; i++){       
       printf("My rank is: %d num is: %d\n",my_rank, i);       
   }
}

但它给出了以下输出:

My rank is: 0 num is: 0
My rank is: 0 num is: 1
My rank is: 0 num is: 2
My rank is: 0 num is: 3
My rank is: 2 num is: 0
My rank is: 2 num is: 1
My rank is: 2 num is: 2
My rank is: 2 num is: 3
My rank is: 3 num is: 0
My rank is: 3 num is: 1
My rank is: 3 num is: 2
My rank is: 3 num is: 3
My rank is: 1 num is: 0
My rank is: 1 num is: 1
My rank is: 1 num is: 2
My rank is: 1 num is: 3

问题是什么?

标签: cmultithreadingparallel-processingopenmppragma

解决方案


你不应该重复parallel,你已经在一个parallel块内,所以你只需要pragma omp for循环,如果你指定,每个执行parallel块的线程都会自动占用循环的一部分pragma omp for。如果要指定可以执行的线程数,pragma omp parallel num_threads(4)然后pragma omp for. 在任何情况下,对于这么简单的一段代码,您都可以删除似乎不需要的整个外部块。

这是正确的版本:

#pragma omp parallel num_threads(4)
{
  int my_rank = omp_get_thread_num();

  #pragma omp for
  for(int i = 0; i < 4; i++){       
      printf("My rank is: %d num is: %d\n", my_rank, i);       
  }
}

或者简单地说:

#pragma omp parallel for num_threads(4)
for(int i = 0; i < 4; i++){       
    printf("My rank is: %d num is: %d\n", omp_get_thread_num(), i);       
}

推荐阅读