OpenMP: почему я не получаю разные идентификаторы потоков, когда я использую "#pragma omp parallel num_threads (4)" - программирование
Подтвердить что ты не робот

OpenMP: почему я не получаю разные идентификаторы потоков, когда я использую "#pragma omp parallel num_threads (4)"

Почему я не получаю разные идентификаторы потоков, когда я использую "#pragma omp parallel num_threads (4)". В этом случае все идентификаторы потоков равны 0. Но когда я комментирую строку и использую количество потоков по умолчанию, у меня есть разные идентификаторы потоков. Примечание: - переменная я использовала переменную tid для получения идентификатора потока.

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) 
{
int nthreads, tid;
int x = 0;

#pragma omp parallel num_threads(4)
#pragma omp parallel private(nthreads, tid)
  {
  /* Obtain thread number */
 tid = omp_get_thread_num();
  printf("Hello World from thread = %d\n", tid);

  // /* Only master thread does this */
   if (tid == 0) 
     {
     nthreads = omp_get_num_threads();
     printf("Number of threads = %d\n", nthreads);
     }

  }


}

Вывод кода выше: -

Hello World from thread = 0
Hello World from thread = 0
Number of threads = 1
Hello World from thread = 0
Number of threads = 1
Hello World from thread = 0
Number of threads = 1
Number of threads = 1

Вывод, когда я прокомментирую указанную выше строку: -

Hello World from thread = 3
Hello World from thread = 0
Number of threads = 4
Hello World from thread = 1
Hello World from thread = 2
4b9b3361

Ответ 1

Вы создаете две вложенные параллельные области. Это то же самое, что и при этом:

#pragma omp parallel num_threads(4)
{
  #pragma omp parallel private(nthreads, tid)
  {
    /* Obtain thread number */
    tid = omp_get_thread_num();
    printf("Hello World from thread = %d\n", tid);

    // /* Only master thread does this */
    if (tid == 0) 
    {
      nthreads = omp_get_num_threads();
      printf("Number of threads = %d\n", nthreads);
    }
  }
}

omp_get_num_threads() возвращает количество потоков в самой внутренней области. Таким образом, вы выполняете четыре потока, каждый из которых выполняет один поток.

Внутренняя параллельная область выполняет только один поток, потому что вы не включили вложенный parallelism. Вы можете включить его, вызвав omp_set_nested(1).

http://docs.oracle.com/cd/E19205-01/819-5270/aewbi/index.html

Если вместо создания двух вложенных параллельных областей вы хотите создать единую параллельную область и указать два свойства, вы можете сделать это:

#pragma omp parallel num_threads(4) private(nthreads,tid)
{
  .
  .
  .
}

Ответ 2

Вложение также можно включить, установив для переменной среды OMP_NESTED значение true