Как распознать основной поток в программе 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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