В openmp omp_get_thread_num привязан к физическому потоку? - PullRequest
0 голосов
/ 20 октября 2018

Я понимаю, что 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

1 Ответ

0 голосов
/ 21 октября 2018

В нескольких параллельных регионах это не гарантируется.Вот немного измененный пример:

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;

    // shrinks the threadpool for libgomp
    #pragma omp parallel num_threads(2)
    {
        #pragma omp critical
        std::cout << "num: "<< omp_get_thread_num() << " => tid: " << syscall(__NR_gettid) << std::endl;
    }

    std::cout << "------------------------------------------------------------" << std::endl;
    std::cout << "Entering region 3:" << std::endl;

    #pragma omp parallel
    {
        #pragma omp critical
        std::cout << "num: "<< omp_get_thread_num() << " => tid: " << syscall(__NR_gettid) << std::endl;
    }

    return 0;
}

Это вывод (gcc 8.2.1):

Entering region 1:
num: 0 => tid: 11845
num: 6 => tid: 11851
num: 3 => tid: 11848
num: 5 => tid: 11850
num: 7 => tid: 11852
num: 4 => tid: 11849
num: 2 => tid: 11847
num: 1 => tid: 11846
------------------------------------------------------------
Entering region 2:
num: 1 => tid: 11846
num: 0 => tid: 11845
------------------------------------------------------------
Entering region 3:
num: 2 => tid: 11853
num: 7 => tid: 11858
num: 5 => tid: 11856
num: 4 => tid: 11855
num: 1 => tid: 11846
num: 3 => tid: 11854
num: 0 => tid: 11845
num: 6 => tid: 11857

Пул потоков между параллельными областями не определен стандартом OpenMP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...