Re: [cppba] Bloque de memoria read-only compartido entre hilos

12 views
Skip to first unread message

Daniel Gutson

unread,
Mar 28, 2013, 9:14:42 PM3/28/13
to cp...@googlegroups.com
perdón la respuesta tonta, por el top posting, y por si es inútil (pero ya que nadie responde...)

  - yo nunca laburé con OMP, pero probaste haciendo un programita ejemplo con const, de un buffer simple? Por ejemplo

const float buffer = malloc(blablabla);

y luego supongo algo del tipo... (ojo acá mando fruta porque toco de oido)
#pragma parallel
for (size_t i = 0; i < blablabla; ++i )
     suma += buffer[i];

 ?

2013/3/27 Javi Ortiz <ortiz...@gmail.com>
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+un...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 



--
Who’s got the sweetest disposition?
One guess, that’s who?
Who’d never, ever start an argument?
Who never shows a bit of temperament?
Who's never wrong but always right?
Who'd never dream of starting a fight?
Who get stuck with all the bad luck?

Daniel Gutson

unread,
Mar 28, 2013, 9:15:38 PM3/28/13
to cp...@googlegroups.com
aclaro, lo que quiero decir es si probaste hacer algo del tipo

void hacerLoQueQueresPorCadaThread(const float* const * elBuffer)
{
   .....
}

2013/3/28 Daniel Gutson <daniel...@gmail.com>

Javi Ortiz

unread,
Mar 29, 2013, 3:28:02 PM3/29/13
to cp...@googlegroups.com
Que tal Daniel, muchas gracias por las respuestas... En este caso, los problemas que tengo son dos:
1) La definción de la función yo no la manejo ya que viene dada en la librería ACML y como no están definidos los parámetros const ahí, no puedo utilizarlos en mi código.
2) No puedo llamar al bloque const ya que algunas veces se modifica el bloque... Nunca cuando alguien lo esté modificando va a haber alguien intentandolo leer ya que está resuelto a través de una tabla de dependencias...

Muchas gracias de todo modo!
Saludos, Javi
Reply all
Reply to author
Forward
0 new messages