Mi aplicación unix/windows C++ ya está paralelizada utilizando MPI: el trabajo se divide en N cpus y cada fragmento se ejecuta en paralelo, bastante eficiente, muy buena escala de velocidad, el trabajo se hace bien .memoria compartida, MPI y sistemas de colas
Pero algunos de los datos se repiten en cada proceso, y por razones técnicas, estos datos no se pueden dividir fácilmente en MPI (...). Por ejemplo:
- 5 Gb de datos estáticos, exactamente lo mismo cargado para cada proceso
- 4 Gb de datos que puede ser distribuido en MPI, se utilizan los más CPU, más pequeño este RAM por CPU es .
En un trabajo de 4 CPU, esto significaría al menos una carga de RAM de 20Gb, la mayor parte de la memoria 'desperdiciada', esto es horrible.
Estoy pensando en utilizar la memoria compartida para reducir la carga general, el trozo "estático" se cargará una sola vez por computadora.
Por lo tanto, la pregunta principal es:
¿Hay alguna manera estándar MPI para compartir la memoria en un nodo? Algún tipo de biblioteca disponible + gratuita?
- De lo contrario, utilizaría
boost.interprocess
y usaría las llamadas MPI para distribuir los identificadores de memoria compartida local. - La memoria compartida sería leída por un "maestro local" en cada nodo, y compartida de solo lectura. No es necesario ningún tipo de semáforo/sincronización, porque no cambiará.
- De lo contrario, utilizaría
¿Hay algún problema de rendimiento o problemas particulares de los que tenga cuidado?
- (No habrá ningún "cadenas" o estructuras de datos excesivamente extraños, todo puede reducirse a arreglos y apuntadores estructura)
El trabajo se ejecuta en un PBS (o SGE) sistema de colas, en el caso de una salida impura del proceso, me pregunto si esas limpiarán la memoria compartida específica del nodo.
Después de las respuestas hasta ahora, pruebas y lecturas adicionales, los archivos mapeados en memoria podrían ser la opción más fácil: - Solo el proceso maestro MPI necesitaría "preparar" el archivo de memoria, que será mapeado por todos los procesos. - Dado que el archivo será de solo lectura, no hay necesidad de preocuparse por la coherencia del contenido. - No hay idea sobre el rendimiento aunque ... tal vez solo el experimento diga. – Blklight
El rendimiento depende completamente de su plataforma. Sus detalles son escasos, pero dado sus CPU y RAM disponibles, no debería tener un gran problema. El único lugar donde fallan los archivos mmapped es si necesita cambiar la memoria compartida (sus datos distribuidos), no necesita que los contenidos de la memoria compartida sean persistentes, y solo necesita RAM compartida. En ese caso, su sistema perderá mucho tiempo escribiendo todos sus cambios de memoria en el disco. –
Estaba ausente y no pude elegir en la respuesta final, la que obtuvo más votos :) Pero bueno, muchas buenas respuestas, pero nada que responda exactamente a lo que estaba buscando, así que supongo que no hay una gran cantidad de respuestas. -forma estandarizada para hacer esto! – Blklight