c++ - omp - openmp tutorial español
Establezca el número de subprocesos usando omp_set_num_threads() en 2, pero omp_get_num_threads() devuelve 1 (3)
Estás utilizando la función incorrecta. use omp_get_max_threads
para verificar el número máximo de hilos permitidos.
Tengo el siguiente código C / C ++ usando OpenMP:
int nProcessors=omp_get_max_threads();
if(argv[4]!=NULL){
printf("argv[4]: %s/n",argv[4]);
nProcessors=atoi(argv[4]);
printf("nProcessors: %d/n",nProcessors);
}
omp_set_num_threads(nProcessors);
printf("omp_get_num_threads(): %d/n",omp_get_num_threads());
exit(0);
Como puede ver, estoy tratando de establecer el número de procesadores que se utilizarán en función de un argumento pasado en la línea de comandos.
Sin embargo, estoy obteniendo el siguiente resultado:
argv[4]: 2 //OK
nProcessors: 2 //OK
omp_get_num_threads(): 1 //WTF?!
¡¡¿Por qué omp_get_num_threads()
devuelve 2? !!!
Como se ha señalado, estoy llamando a omp_get_num_threads()
en una región serial, por lo tanto, la función devuelve 1
.
Sin embargo, tengo el siguiente código paralelo:
#pragma omp parallel for private(i,j,tid,_hash) firstprivate(firstTime) reduction(+:nChunksDetected)
for(i=0;i<fileLen-CHUNKSIZE;i++){
tid=omp_get_thread_num();
printf("%d/n",tid);
int nThreads=omp_get_num_threads();
printf("%d/n",nThreads);
...
que produce:
0 //tid
1 //nThreads - this should be 2!
0
1
0
1
0
1
...
La llamada omp_get_num_threads()
devuelve 1 en la sección serial del código. Ver Link
Por lo tanto, debe tener un código paralelo para obtener el valor correcto, aquí debe verse el aspecto de su código:
#include <iostream>
#include <omp.h>
int main (int argc, const char * argv[])
{
int nProcessors = omp_get_max_threads();
std::cout<<nProcessors<<std::endl;
omp_set_num_threads(nProcessors);
std::cout<<omp_get_num_threads()<<std::endl;
#pragma omp parallel for
for(int i = 0; i < 5; i++){
int tid = omp_get_thread_num();
std::cout<<tid<<"/t tid"<<std::endl;
int nThreads = omp_get_num_threads();
std::cout<<nThreads<<"/t nThreads"<<std::endl;
}
exit(0);
}
Este código produce:
2
1
0 tid
2 nThreads
0 tid
2 nThreads
0 tid
2 nThreads
1 tid
2 nThreads
1 tid
2 nThreads
Parece que tienes mp abierto no habilitado o tu bucle no está en la forma que se puede paralizar con openmp
Ya se ha señalado que omp_get_num_threads()
devuelve 1
en secciones secuenciales del código. En consecuencia, incluso si configuramos, mediante omp_set_num_threads()
, un número total de subprocesos mayores que 1
, cualquier llamada a omp_get_num_threads()
devolverá 1
, a menos que estemos en una sección paralela. El siguiente ejemplo trata de aclarar este punto.
#include <stdio.h>
#include <omp.h>
int main() {
const int maxNumThreads = omp_get_max_threads();
printf("Maximum number of threads for this machine: %i/n", maxNumThreads);
printf("Not yet started a parallel Section: the number of threads is %i/n", omp_get_num_threads());
printf("Setting the maximum number of threads.../n");
omp_set_num_threads(maxNumThreads);
printf("Once again, not yet started a parallel Section: the number of threads is still %i/n", omp_get_num_threads());
printf("Starting a parallel Section.../n");
#pragma omp parallel for
for (int i = 0; i < maxNumThreads; i++) {
int tid = omp_get_thread_num();
printf("This is thread %i announcing that the number of launched threads is %i/n", tid, omp_get_num_threads());
}
}