[C con Clase] vectorizar matrices & Threads

Alejandro Vázquez Otero alnavegante en gmail.com
Mar Feb 24 20:42:35 CET 2009


Programante, tal y como yo lo entiendo, los dos hilos no pueden acceder 
al mimo tiempo
a un elemento de matriz[j][i]  -aunque sean elementos distintos-.Porque 
esta matriz solo tiene un canal de entrada/salida
para acceder a sus elementos.  Insisto en que lo me interesa es que los 
dos hilos se ejecuten
al mismo tiempo.

Si yo ejecuto tu codigo, como el ordenador trabaja muy rapido yo no 
aprecio el retraso.
Pero lo cierto es que internamente hay un cuello de botella.

Piensa que cuando el primer hilo accede al elemento [3][3]   -por 
ejemplo-, el segundo hilo
no puede acceder a ningun otro elemento hasta que el primer hilo libere 
el canal de entrada/salida
pues solo se puede accer a la matriz por ahi... y en ese preciso momento 
esta ocupado por el primer
hilo. Asi, el segundo hilo tiene que esperar a que el primero acceda a 
ese valor y libere el canal.

Lo que a mi me interesa es vectorizar la matriz -estoy integrando 
ecuaciones- para poder acceder "al mismo tiempo"
a valores que estan en vectores distintos.

Un ejemplo, si recorres una matriz varias veces -con un solo hilo- tarda 
x tiempo. Pero si lo haces con dos hilos
tarda varias veces x. La clave esta en poder vectorizar para que los 
espacios en ram a los que acceden los hilos
sean distintos...

Un saludo,

    Alejandro


Programante wrote:
> Alejandro Vázquez Otero escribió:
>   
>> En primer lugar muchas gracias por responder tan pronto, Programante.
>> La solucion que propones es funcional, pero pierdes la vectorizacion.
>> Me explico, una matriz declarada de esta forma:*
>> *
>>
>> float matriz[10][10];
>>
>>
>> solo tiene un canal de entrada/salida. Por lo que cada hilo tiene
>> que acceder por el mismo canal a la matriz. Esto es, generamos un
>> cuello de botella
>> cuando los dos hilos acceden a la misma matriz en la RAM.
>> Mi intencion es vectorizarla, para que cada hilo acceda de forma
>> independiente a
>> vectores distintos, evitando los cuellos de botella.
>>     
> ¿Perdón?? Me parece que estás mezclando conceptos.
> El código generado puede ser perfectamente el mismo haciendo float
> matriz[10][10];
> que con
> float matriz0[10];
> float matriz1[10];
> float matriz2[10];
> float matriz3[10];
> float matriz4[10];
> float matriz5[10];
> float matriz6[10];
> float matriz7[10];
> float matriz8[10];
> float matriz9[10];
>
> Si no te gustaba la operación matriz[DesdeDonde+j] puedes usar punteros.
> Usé ese método por ser más claro.
>
> LanzarHilo( OperarMatriz, matriz ); /* Este hilo hace las 5 primeras columnas*/
> OperarMatriz(matriz + 5); /* Y el hilo principal las otras 5 */
> ...
> }
>
> int OperarMatriz(float** mimatriz) {
>     for (j=0; j<5; j++)  for (i=0; i<10; i++)  { mimatriz[j][i]=operaciones; }
> }
>
>
>
>   
>> Y ademas, al vector que haga de frontera deberan poder acceder los dos
>> hilos (en momentos
>> distintos, eso si), por lo que necesariamente tiene que tratarse de
>> vectores.
>>     
> El problema es que no puedes asegurar que sean momentos distintos.
> Tienes que añadir algún mecanismo de sincronización (semáforos,
> secciones críticas...).
>
>
> _______________________________________________
> 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
>
>   





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