Абсолютный идентификатор потока при использовании вложенного параллелизма OpenMP - PullRequest
0 голосов
/ 08 мая 2020

Когда для переменной среды OMP_NESTED установлено значение TRUE, следующий код:

#include <stdio.h>
#include <omp.h>

int main (){
    #pragma omp parallel for num_threads(2)
    for(int i = 0; i<=20;i++)
        {
        int t1 = omp_get_thread_num();
        #pragma omp parallel for num_threads(4)
        for(int j = 0; j<=20;j++)
        {
            int t2 = omp_get_thread_num();
            #pragma omp critical
            {
                printf("[%d,%d]\n",t1, t2);
            }
        }
    }
}

Выводит следующие пары:

[0,0]
[0,1]
[0,2]
[0,3]
[1,0]
[1,1]
[1,2]
[1,3]

(значения отсортированы, а дубликаты удалены. )

Вызов omp_get_thread_num(), который находится внутри самого внутреннего #pragma omp parallel for, явно возвращает значения от 0 до 3, хотя на самом деле существует 8 параллельных потоков.

Я хотел бы найдите способ получить значения от 0 до 7, как если бы все 8 потоков были выделены одному для l oop.

В этом конкретном примере я мог бы просто сделать thread_num = t1 * 4 + t2. Однако мой вопрос: как я могу сделать это, не обращаясь к значениям за пределами самой внутренней параллельной секции? Как я могу получить это значение без использования t1?

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