Aquí hay un programa recursivo simple que se divide en dos para cada llamada recursiva. Como era de esperar, el resultado es 2 + 4 + 8 llamadas a rec, pero el número de subprocesos es siempre el mismo: dos, y los identificadores rebotan entre 0 y uno. Esperaba que cada llamada recursiva retuviera la identificación, y que al final se hicieran 8 subprocesos. ¿Qué está pasando exactamente? ¿Hay algún problema con el código?
#include <stdio.h> #include <omp.h> void rec(int n) { if (n == 0) return; #pragma omp parallel num_threads(2) { printf("Currently at %d -- total %d\n", omp_get_thread_num(), omp_get_num_threads()); rec(n - 1); } } int main() { omp_set_nested(1); rec(3); }Su código funciona como se esperaba según el estándar OpenMP. En la documentación de OpenMP puede encontrar lo siguiente sobre omp_get_num_threads :
Resumen: la rutina omp_get_num_threads devuelve el número de subprocesos en el equipo actual .
Enlace: la región de enlace para una región omp_get_num_threads es la región paralela envolvente más interna .
Efecto: la rutina omp_get_num_threads devuelve la cantidad de subprocesos en el equipo que está ejecutando la región paralela a la que se vincula la región de la rutina. Si se llama desde la parte secuencial de un programa, esta rutina devuelve 1.
omp_get_thread_num tiene la misma región de enlace:
La región de enlace para una región omp_get_thread_num es la región paralela envolvente más interna .
Significa que omp_get_num_threads y omp_get_thread_num se unen solo a la región paralela más interna, por lo que no importa cuántas regiones paralelas anidadas se utilicen. Cada una de sus regiones paralelas está definida por #pragma omp parallel num_threads(2) , por lo tanto, el valor de retorno de omp_get_num_threads es 2 (siempre que tenga suficientes subprocesos disponibles) y el valor de retorno de omp_get_thread_num es 0 o 1 .