[C con Clase] threads vs openmp

Jorge Vega Sanchez memmaker650 en gmail.com
Mar Jun 8 11:11:05 CEST 2010


Comentarte algunas cosas.

Sobre pthreads. El hilo que creas en el programa principal puede que  
funcione pero de chiripia, es necesario o muy recomendable definir  
idetificadores de hilo. Luego hay que darle unas propiedades a cada  
hilo. Y una vez creado normlamente el programa principal debe esperar  
a que termine con un pthread_join(id_hilo_creado);
El pthread_exit() es para la finalización de los hilos.

Segundo, usar en un programa tanto pthread como OpenMP me parece raro  
por no decir otra palabra (estupido). Es muy facil liarse mezclando  
cosas. Selecciona una de los dos métodos y trata de dominarlo lo más  
posible.

Tercero, hablar de hilos hijos digamos que es un tanto erroneo. Sólo  
se usa con procesos.

Cuarto. Esto ya es mas vanal pero para compilar, g++ -fopenmp man.cc - 
o main, no es necesario que pongas -fopenmp porque ya la defines por  
defecto y por lo tanto el compilador ya sabe donde buscar la librería.
On 07/06/2010, at 22:27, Alejandro Vázquez wrote:

> Hola Samuel,
>
> gracias por la respuesta. Tienes razón en que olvidé incluir un  
> "pthread_exit(NULL)" tras lanzar el hilo para que el main espere a  
> que termine su ejecucion. Pero el problema no esta ahi.
> Poniendo esta "barrera" para que el main espera a que termine el  
> hilo, igualmente dentro del hilo la instancia openmp no se ejecuta  
> correctamente. En este ejemplo deberian lanzarse 4 hilos hijos desde  
> ese thread (debido a la clausula openmp) y en su lugar sólo aparece  
> uno!!
>
> Buceando por los foros de gcc parece que esta señalado como un bug.  
> Lo he descubierto hace poco... hay algun problema con el gcc (g++) y  
> lanzar hilos hijos desde un thread via openmp.
>
> En cualquier caso un saludo y gracias por responder.
>
>    Alejandro
>
>
>
> El 7 de junio de 2010 18:06, Samuel Díaz García  
> <samueldg en arcoscom.com> escribió:
> Bajo el supuesto de que todo funcione, yo entiendo lo siguiente:
>
>   1) Defines la función del hilo.
>   2) En el main() entiendo se lanza UN hilo.
>   3) Se termina el main() (sin esperar a que termine la ejecución de  
> los hilos ni nada).
>
> ¿Sigues preguntando por qué no te funciona? Yo, desde mi punto de  
> vista, sin conocer bien cómo funcionan las librerías "openmp", creo  
> que el código que has mostrado no es muy consistente.
>
> Creo que deberías saber primero en qué orden usar las diferentes  
> funciones de "openmp", para inicializar y demás.
>
> Aparte de ello, lo normal, es que el proceso principal siempre  
> espere a que terminen los procesos hijos, ahora bien, al ser "hilos"  
> de ejecución, se entiende que al terminar el proceso principal, el  
> sistema operativo abortará la ejecución de cuantos hilos haya  
> lanzado éste.
>
> Salu2
>
>
>
> Alejandro Vázquez escribió:
> Hola a todos,
> lo primero un saludo a todos. Mi cuestion es muy simple: tengo un  
> programilla que paraleliza una suma matricial (al menos en esencia)  
> bajo openmp, y funciona perfectamente, de  47 segundos pasamos a 4.  
> El caso que es que realizando la misma paralelización dentro de un  
> thread no funciona. Les adjunto un ejemplo mas simple donde lanzo un  
> thread y dentro del mismo implemento una paralelización con openmp.  
> Si funcionase cada uno de los hilos hijo deberia imprimir su  
> número... pero no es asi.
> Pues haber si hay suerte  :-)
> Compilo con: "g++ -fopenmp man.cc -o main" en ubuntu 10.4
>
>
>
> #include <iostream>
> #include <omp.h>
> #include <pthread.h>
> using namespace std;
>
> void *hilo(void *pointer) {
> cout << "Entrando en thread" << endl<<endl;
> int j;
> #define NUM_THREADS 4 omp_set_num_threads(NUM_THREADS);
> #pragma omp parallel {
> int m;
> #pragma omp for  private(j,m)
> for (j=1;j<5;j++) {
> m=omp_get_thread_num();
> cout << "thread:" << m << "_"  << j  << endl;
> std::cout.flush();
> }
> }
> std::cout.flush();
>
>
> }
>
> main() {
>
> pthread_t idHilo;
> pthread_create(&idHilo,NULL, hilo, NULL);
> std::cout.flush();
>
> }
>
>
>
>
>
>
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
> -- 
>   Samuel Díaz García
>    Director Gerente
> ArcosCom Wireless, S.L.U.
>
> CIF: B11828068
> c/ Romero Gago, 19
> Arcos de la Frontera
> 11630 - Cadiz
>
> http://www.arcoscom.com
>
> mailto:samueldg en arcoscom.es
> msn: samueldg en arcoscom.com
>
> Móvil: 651 93 72 48
> Tlfn.: 956 70 13 15
> Fax:   956 70 34 83
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
>
>
> -- 
> Alejandro Vazquez-Otero
> Group of Non Linear Physics
> Facultad de Fisicas. Univ. de Santiago de Compostela
> 15782 Santiago de Compostela. Spain
> Tel: (+34) 981 563100 x 14002
> Fax: (+34) 981 522089
> E-Mail: alnavegante en gmail.com  alejandro.vazquez en rai.usc.es
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100608/79d0a580/attachment.html>


Más información sobre la lista de distribución Cconclase