2012-06-19 14 views
22

Estoy escribiendo un programa paralelo usando OpenMP en C++.OpenMP set_num_threads() no funciona

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; 
} 

Los productos de los programas:

sum = 4.5e+007 
threads=1 

Cómo controlar el número de hilos?

Respuesta

69

Además de llamar al omp_get_num_threads() fuera de la región paralela en su caso, llamar al 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 utiliza para anular 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 consecuente (después de una llamada al 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 al omp_set_dynamic(0) o estableciendo la variable de entorno OMP_DYNAMIC en false.

para hacer cumplir un determinado número de hilos que deben desactivar equipos dinámicos y especificar el número deseado de hilos, ya sea con 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 num_threads OpenMP:

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 ... 
} 
+0

Pero no pude obtener ninguna aceleración cambiando el número de subprocesos y también configurando el omp_set_dynamic (0) ?? – Nurlan

+4

Primero, la versión_serial_ lleva 50 ms en mi CPU. No puede esperar una aceleración para códigos tan rápidos debido a la sobrecarga de OpenMP. Ponga 100x más interacciones en el bucle. En segundo lugar, te falta la región 'parallel' en tu código original. Has escrito '#pragma omp for ...' mientras que debería ser '#pragma omp parallel for ...'. En tercer lugar, está mezclando MPI y OpenMP. ¿Estás seguro de que sabes exactamente lo que estás haciendo? –

+0

@HristoIliev ¿puede un usuario controlar dinámicamente el número de subprocesos? es decir, en lugar de usar un '4' codificado. usar una variable? – manatttta

15

La función omp_get_num_threads() devuelve el número de subprocesos 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.

3

Según GCC manual for omp_get_num_threads:

En orden secuencial reflejo de las omp_get_num_threads programa devuelve 1

Así que esto:

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

se debe cambiar 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 desactivación de equipos dinámicos de Hristo, también .

2

Tenía el mismo problema. Solución A continuación se da

clic derecho sobre la fuente de programa> Propiedades> Propiedades de configuración> C/++> Lenguaje C> Ahora cambia la bandera de apoyo abierto a MP Sí ....

obtendrá el resultado deseado.