Причина, по которой вы получаете ошибку, заключается в том, что главный поток не существует в большинстве случаев, когда код достигает строки #pragma omp master
.Например, давайте возьмем код от Артема:
#include <omp.h>
void f(){}
int main()
{
#pragma omp parallel for schedule (guided)
for (int i = 0; i < 100; ++i)
{
#pragma omp master
f();
}
return 0;
}
Если код скомпилируется, может произойти следующее:
Допустим, поток 0 запускается (основной поток).Он достигает прагмы, которая практически гласит: «Учитель, сделай следующий кусок кода».Будучи хозяином, можно запустить функцию.Однако что происходит, когда поток 1, 2 или 3 и т. Д. Достигает этого куска кода?
Основная директива сообщает команде present / listening , что главный поток должен выполнить f()
.Но команда - это одна нить, а мастера нет.Программа не будет знать, что делать после этого.
И именно поэтому, я думаю, мастеру не разрешено находиться внутри цикла for.
Замена master directive
на if (omp_get_thread_num() == 0)
работает, потому что теперь программа говорит: «Если вы мастер, сделайте это. В противном случае игнорируйте».