В 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.
Идея параллельных секций состоит в том, чтобы дать компилятору подсказку о том, что различные (внутренние) секции могут выполняться параллельно, например:
#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. Порядок вывода не является детерминированным, поскольку вы не знаете, какой поток будет запущен первым.