threads omp number for c++ multithreading numbers set openmp

c++ - omp - OpenMP set_num_threads() no funciona



openmp set number of threads (5)

Estoy escribiendo un programa paralelo usando OpenMP en C ++.

Quiero controlar el número de subprocesos en el programa usando omp_set_num_threads() , pero no funciona.

#include <iostream> #include <omp.h> #include "mpi.h" using namespace std; int myrank; int groupsize; double sum; double t1,t2; int n = 10000000; int main(int argc, char *argv[]) { MPI_Init( &argc, &argv); MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); MPI_Comm_size(MPI_COMM_WORLD,&groupsize); omp_set_num_threads(4); sum = 0; #pragma omp for reduction(+:sum) for (int i = 0; i < n; i++) sum+= i/(n/10); cout<<"sum="<<sum<<endl; cout<<"threads="<<omp_get_num_threads()<<endl; MPI_Finalize(); return 0; }

Las salidas del programa:

sum = 4.5e+007 threads=1

¿Cómo controlar el número de hilos?


Además de llamar a omp_get_num_threads() fuera de la región paralela en su caso, llamar a omp_set_num_threads() aún no garantiza que el tiempo de ejecución de OpenMP use exactamente el número especificado de subprocesos. omp_set_num_threads() se usa para reemplazar el valor de la variable de entorno OMP_NUM_THREADS y ambos controlan el límite superior del tamaño del equipo de subprocesos que OpenMP generaría para todas las regiones paralelas (en el caso de OMP_NUM_THREADS ) o para cualquier región paralela consiguiente ( después de una llamada a omp_set_num_threads() ). Hay algo llamado equipos dinámicos que aún podrían elegir un número menor de subprocesos si el sistema de tiempo de ejecución lo considera más apropiado. Puede deshabilitar equipos dinámicos llamando a omp_set_dynamic(0) o configurando la variable de entorno OMP_DYNAMIC en false .

Para imponer un número dado de subprocesos, debe deshabilitar los equipos dinámicos y especificar el número deseado de subprocesos con cualquiera de omp_set_num_threads() :

omp_set_dynamic(0); // Explicitly disable dynamic teams omp_set_num_threads(4); // Use 4 threads for all consecutive parallel regions #pragma omp parallel ... { ... 4 threads used here ... }

o con la cláusula OpenMP num_threads :

omp_set_dynamic(0); // Explicitly disable dynamic teams // Spawn 4 threads for this parallel region only #pragma omp parallel ... num_threads(4) { ... 4 threads used here ... }


De acuerdo con el manual de GCC para omp_get_num_threads :

En una sección secuencial del programa, omp_get_num_threads devuelve 1

Así que esto:

cout<<"sum="<<sum<<endl; cout<<"threads="<<omp_get_num_threads()<<endl;

Debe ser cambiado a algo como:

#pragma omp parallel { cout<<"sum="<<sum<<endl; cout<<"threads="<<omp_get_num_threads()<<endl; }

El código que utilizo sigue el consejo de Hristo de desactivar los equipos dinámicos también.


Estaba enfrentando el mismo problema. La solución se da a continuación.

Haga clic con el botón derecho en Programa de origen> Propiedades> Propiedades de configuración> C / C ++> Idioma> Ahora cambie el indicador de soporte de Open MP a Sí ...

Obtendrá el resultado deseado.


Intente configurar sus números de subprocesos dentro de su código paralelo omp, funcionó para mí. Esto dará salida como 4

#pragma omp parallel { omp_set_num_threads(4); int id = omp_get_num_threads(); #pragma omp for for (i = 0:n){foo(A);} } printf("Number of threads: %d", id);


La función omp_get_num_threads() devuelve el número de subprocesos que están actualmente en el equipo que ejecuta la región paralela desde la que se llama . Lo está llamando fuera de la región paralela, por lo que devuelve 1 .