Я понимаю, что OpenMP использует пул потоков для повторного использования физических потоков.У меня вопрос, связан ли номер потока, полученный из omp_get_thread_num
, с физическим потоком?
Другими словами, всегда ли отображение omp_get_thread_num
на gettid
( gettid man page ) всегда одинаково во всех параллельных регионах?
Раздел 3.2.4 из спецификации OpenMP ( ссылка )
Связывание
Текущий связующий поток, установленный для области omp_get_thread_num, является текущей командой.Область связывания для области omp_get_thread_num является самой внутренней охватывающей параллельной областью.
Эффект
Подпрограмма omp_get_thread_num возвращает номер потока вызывающего потока в пределах команды 10, выполняющей параллельную область, к которой относитсярутинный регион связывает.Номер потока - это целое число от 0 до единицы, которое меньше значения, возвращаемого omp_get_num_threads включительно.Номер потока основного потока команды равен 0. Подпрограмма возвращает 0, если она вызывается из последовательной части программы.
Простой тест с использованием системного вызова gettid
Код ниже CentOS 7, использующий GCC, дает мне одинаковое отображение для двух параллельных областей.Но я не уверен, является ли это просто частным случаем.
#include <unistd.h>
#include <sys/syscall.h>
#include <iostream>
#include <omp.h>
int main(int argc, char *argv[]) {
std::cout << "Entering region 1:" << std::endl;
#pragma omp parallel
{
#pragma omp critical
std::cout << "num: "<< omp_get_thread_num() << " => tid: " << syscall(__NR_gettid) << std::endl;
}
std::cout << "------------------------------------------------------------" << std::endl;
std::cout << "Entering region 2:" << std::endl;
#pragma omp parallel
{
#pragma omp critical
std::cout << "num: "<< omp_get_thread_num() << " => tid: " << syscall(__NR_gettid) << std::endl;
}
return 0;
}
Вот вывод, который я получаю в CentOS 7, используя GCC (5.2).
Entering region 1:
num: 0 => tid: 625
num: 5 => tid: 630
num: 7 => tid: 632
num: 11 => tid: 636
num: 3 => tid: 628
num: 13 => tid: 638
num: 1 => tid: 626
num: 9 => tid: 634
num: 6 => tid: 631
num: 10 => tid: 635
num: 12 => tid: 637
num: 2 => tid: 627
num: 4 => tid: 629
num: 8 => tid: 633
num: 14 => tid: 639
num: 15 => tid: 640
------------------------------------------------------------
Entering region 2:
num: 4 => tid: 629
num: 12 => tid: 637
num: 15 => tid: 640
num: 5 => tid: 630
num: 8 => tid: 633
num: 13 => tid: 638
num: 0 => tid: 625
num: 9 => tid: 634
num: 1 => tid: 626
num: 6 => tid: 631
num: 3 => tid: 628
num: 7 => tid: 632
num: 10 => tid: 635
num: 11 => tid: 636
num: 2 => tid: 627
num: 14 => tid: 639
Компиляция: g++ toy.cpp -fopenmp