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
.