Как распознать основной поток в программе OpenMP?C++

Программы на C++. Форум разработчиков
Anonymous
Как распознать основной поток в программе OpenMP?

Сообщение Anonymous »

OpenMP использует собственную схему нумерации потоков, начиная с 0 для главного потока. Главный поток — это поток, который инициировал параллельную область, которая в следующем примере является основным потоком программы.

Код: Выделить всё

int main()
{
// only the main program thread exists here

#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0)
{
// this block is guaranteed to be executed by the main program thread
}
}
}
В этом случае основной поток программы легко распознать в параллельном разделе. Однако рассмотрим другой пример с вложенным параллелизмом:

Код: Выделить всё

int main()
{
// only the main program thread exists here

#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 1)
{
#pragma omp parallel num_theads(2)
{
if (omp_get_thread_num() == 0)
{
// this block is NOT executed by the program main thread
}
}
}
}
}
Теперь главный поток во вложенной параллельной области не является основным потоком программы, поэтому распознавание его путем сравнения идентификатора потока OpenMP с 0 здесь не работает.
Демонстрация в реальном времени: https://godbolt.org/z/5K3ja8fY1
Мой вопрос заключается в том, есть ли какой-либо способ распознать основной поток программы в параллельной области OpenMP, которая всегда работает.
(Я мог бы использовать для этой цели std::this_thread::get_id(), как показано в демо; однако я не уверен, гарантируется ли переносимость вместе с OpenMP.)

Подробнее здесь: https://stackoverflow.com/questions/798 ... mp-program

Вернуться в «C++»