[C con Clase] Threads en C

Alnavegante alnavegante en gmail.com
Vie Jun 27 08:59:10 CEST 2008


Gracias por responder, Programante. Pero la última parte no entiendo muy
bien lo que expones.
Voy a intentar ser un poco más claro. Lo que estoy haciendo es "integrar"
ecuaciones diferenciales no lineales. Para ello tengo dos matrices
principales:

   float u[dimy][dimx] y v[dimy][dimx]   //la declaracion no la hago
exactamente asi, sino empleando malloc() y algunas cosillas mas... pero da
lo mismo.

u y v son las variables de las dos ecuaciones diferenciales que hay que
discretizar. Digamos que el esquema del programa sería algo asi:


////////////////////////////////////////////////////////////////////////////////////////////////
float u[1000][1000] y v[1000][1000]   //y otras muchas matrices y
variables...


unsigned  WINAPI uno(LPVOID param)
    {
    for( j1=1; j1<(1000/2); j1++ )
        {
        for( i1=1; i1<1000-1; i1++ )

            {
            unew[j1][i1]=funcion de  u[j1][i1] y v[j1][i1]   u[j1+1][i1-1] y
v[j1-1][i1+1]   //y otras cosas...
            unew[j1][i1]=funcion de  u[j1][i1] y v[j1][i1]   u[j1+1][i1-1] y
v[j1-1][i1+1]   //y otras cosas..
            }
        }

unsigned  WINAPI dos(LPVOID param)
    {
    for( j2=(1000/2); j2<1000; j2++ )
        {
        for( i2=1; i2<1000-1; i2++ )
            {
            unew[j2][i2]=....idem que en el anterior hilo
            vnew[j2][i2]=....
            }
        }
    }

    }
main()
    {
        HANDLE threadArray[numThreads];
        threadArray[0] = (HANDLE) _beginthreadex(NULL, 0, uno,(LPVOID) 1U,
0, &threadID);
        threadArray[1] = (HANDLE) _beginthreadex(NULL, 0, dos,(LPVOID) 2U,
0, &threadID);
    }
*****************************************************************************************************


este programa en teoría ejecuta dos hilos de forma que el primero recorre
las 500 primeras filas, y el segundo las siguientes 500 de forma que los dos
proceso se ejecutan en paralelo (aunque acceden al mismo array en memoria
donde se encuentran las matrices... no se si esto tendrá algo que ver con el
retraso...).

si en lugar de lo anterior hago la integración en único proceso (sin crear
hilos, esto es, dentro del main() directamente) va entre el doble y el
triple más rápido o incluso más.

    for( j1=1; j1<1000-1; j1++ )
        {
        for( i1=1; i1<1000-1; i1++ )

            {
            unew[j1][i1]=funcion de  u[j1][i1] y v[j1][i1]   u[j1+1][i1-1] y
v[j1-1][i1+1]   //y otras cosas...
            unew[j1][i1]=funcion de  u[j1][i1] y v[j1][i1]   u[j1+1][i1-1] y
v[j1-1][i1+1]   //y otras cosas..
            }
        }



bueno, si necesitais que sea más detallado la próxima vez enviaré un código
funcional. Gracias y espero vuestra respuesta.


El día 26 de junio de 2008 21:14, Programante <programante en gmail.com>
escribió:

> Raúl, dice que lo está ejecutando en un QuadCore, así que tiene varios
> procesadores y sí debería mejorar (introducir hilos genera sobrecarga,
> pero debería superarla el diseño paralelo).
> Alnavegante, ¿cuál es el código exacto que usas? Tanto el código que
> crea los hilos como el que ejecutas dentro (vale un ejemplo, si da ese
> resultado).
> Sólo se me ocurre que estés creando los hilos mal y se esté ejecutando
> en realidad en paralelo (por ejemplo si tuvieras un mutex dentro de f) o
> que por algún motivo estés dinamitando el mecanismo de caché entre los
> dos hilos.
> Por otro lado, ten en cuenta que *no estás obteniendo el mismo
> resultado* en la versión paralela que en la secuencial. Estás asignando
> f() del siguiente (sin procesar) con el anterior (procesado), pero al
> dividirlo en dos, para dimy/2 se calcula f() del siguiente (sin
> procesar) con el anterior (sin procesar... posiblemente).
>
>
> _______________________________________________
> 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/20080627/67512680/attachment.html>


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