Que tal lista, les escribo para ver si a alguno se le ocurre cómo encarar el problema que estoy teniendo:
Estoy utilizando OpenMP en un programa escrito en C y compilado con GCC 4.7.2. Tengo un array de punteros a bloques de memoria de la siguiente forma:
float ** B = malloc (cantBloques * sizeof(float *);
for(i 0->cantBloques) B[i] = malloc (tamañoBloque * sizeof(float));
Estoy realizando un Thread Pool con muchos hilos que ejecutan tareas sobre estos bloques y algunas de esas funciones reciben de parámetro bloques que no van a modificar internamente.
El problema que tengo es que cuando me divido en OMP, dos hilos que utilizan el bloque pero solámente para leerlo es como que se me bloqueasen porque la ejecución se vuelve muy lenta (de hecho es como que uno espera hasta que el otro lo libera y recién ahí comienza su ejecución). Las funciones provienen de la librería ACML y no tienen el modificador const en la declaración así que no hay forma de que el compilador / programa se de cuenta de que no vamos a modificar el bloque en la llamada por lo que cada hilo debe 'tomar' una copia e invalidar a las demás que puedan tener los otros hilos.
Probé haciendole una copia local a cada hilo del bloque con memcpy pero tengo el mismo resultado... Quizás porque cuando entra a la región paralela, el hilo guarda el bloque paralelo en el stack del hilo y dps no lo libera hasta que sale de la región...
La pregunta en concreto es: Hay alguna manera de poder decir programáticamente "No voy a modificar este bloque, no invalides las demás copias"?
Yo tengo resuelta las dependencias de datos mediante una tabla aparte así que estoy 98% seguro de que no voy a tener el problema de que alguien escriba o lea antes de tiempo así que podria desligarme de la coherencia utilizando los mecanismos de OMP o el que los esté manejando actualmente.
A alguien se le ocurre por dónde podría encarar esto?
Desde ya gracias y disculpen si algo no se entiende!
Saludos, Javier
--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "
http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a cppba+unsubscribe <at> googlegroups.com.
Para obtener más opciones, visita
https://groups.google.com/groups/opt_out.