[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