Когда для переменной среды 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
?