[C con Clase] threads vs openmp

Alejandro Vázquez alnavegante en gmail.com
Mar Jun 8 16:42:46 CEST 2010


Hola de nuevo,

y gracias por las respuestas. Jorge:

>>El pthread_exit() es para la finalización de los hilos.

tienes toda la razón, pero a veces las prisas traicionan.

>>usar en un programa tanto pthread como OpenMP me parece raro por no decir
otra palabra (estupido).

bueeeeno, obviamente este programa no tiene mucho jugo. Pero estoy
intentando incorporar determinadas propiedades a otro programa y el anterior
es una exploración. Imagínate cuatro robots (instancias de la clase robot)
cada uno de ellos corriendo en un hilo (thread, tarea, hebra, qué mas dá) y
comunícándose via  la shared memory. Cada uno de estos en un momento
determinado deben correr un modelo (digamos en una malla cartesiana bajo una
discretización FTCS un determinado modelo químico) que es extremadamente
costoso. Y en las pruebas preliminares pasando esta integración espacial a
openmp estoy obteniendo 20x de aceleración. Pues asi ya tiene màs jugo,
claro.

>>Esto ya es mas vanal pero para compilar, g++ -fopenmp man.cc -o main, no
es necesario que pongas -fopenmp

pues lo cierto es que es bastante necesario. Creo que no lo has
compilado...? Otra cosa es que en el programa final vaya todo definido en un
make, pero no voy a hacer un make para un sólo archivo, verdad?.

Un saludo,

  Alejandro




El 8 de junio de 2010 11:11, Jorge Vega Sanchez <memmaker650 en gmail.com>escribió:

> 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
>
>
>
> _______________________________________________
> 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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100608/f0f9a995/attachment.html>


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