Как делает директиву РАЗДЕЛОВ в OpenMP, распределяют работу?

В OpenMP при использовании omp sections, потоки будут распределены блокам в разделах, или каждый распараллелит быть присвоенным каждому, разделяет?

Когда nthreads == 3:

#pragma omp sections
{
    #pragma omp section
    { 
        printf ("id = %d, \n", omp_get_thread_num());
    }

    #pragma omp section
    { 
        printf ("id = %d, \n", omp_get_thread_num());
    }
}

Вывод:

id=1
id=1

Но когда я выполняю следующий код:

#pragma omp sections
{
    #pragma omp section
    { 
        printf ("id = %d, \n", omp_get_thread_num());
    }

    #pragma omp section
    { 
        printf ("id = %d, \n", omp_get_thread_num());
    }
}

#pragma omp sections
{
    #pragma omp section
    { 
        printf ("id = %d, \n", omp_get_thread_num());
    }

    #pragma omp section
    { 
        printf ("id = %d, \n", omp_get_thread_num());
    }
}

Вывод:

id=1
id=1

id=2
id=2

От них вывод я не могу понять то, что понятие разделов находится в OpenMP.

39
задан user7116 13 February 2012 в 16:58
поделиться

1 ответ

Идея параллельных секций состоит в том, чтобы дать компилятору подсказку о том, что различные (внутренние) секции могут выполняться параллельно, например:

#pragma omp parallel sections
{
   #pragma omp section
   {
      /* Executes in thread 1 */
   } 
   #pragma omp section
   {
      /* Executes in thread 2 */
   } 
   #pragma omp section
   {
      /* Executes in thread 3 */
   } 
   /* ... */
}

Это подсказка для компилятора, и ее выполнение не гарантируется, хотя должно . Ваш результат вполне соответствует ожиданиям; в нем говорится, что в потоке с идентификатором 1 и в потоке 2 выполняются #sections. Порядок вывода не является детерминированным, поскольку вы не знаете, какой поток будет запущен первым.

26
ответ дан 27 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: