Tengo una aplicación que puede ser paralelamente trivial, pero su rendimiento está en gran medida vinculado a E / S. La aplicación lee una matriz de entrada única almacenada en un archivo que normalmente tiene un tamaño de 2-5 GB (pero espero que este número crezca en el futuro). Un cálculo típico aplica la misma operación a cada fila o columna de esa matriz. Para operaciones pesadas de CPU, obtengo una escalabilidad muy buena de hasta aproximadamente 100 procesadores, pero para operaciones más lentas, la E / S y la comunicación relacionada (acceso NFS) dominan y no puedo usar más de unos pocos procesadores de manera eficiente.
¿Cuáles son las opciones eficientes y portátiles (idealmente portables eficientes) para tal situación? El HDF5 paralelo parece prometedor. ¿Alguien tiene experiencia en la vida real con él?
¿Merecería la pena considerar MPI-I / O? ¿Puede funcionar de manera eficiente con un diseño de archivo determinado, o tengo que adaptar todo?
fuente
Respuestas:
La E / S paralela puede ayudarlo en este caso, pero si está utilizando NFS (inherentemente bastante serial) para servir sus archivos, entonces no tendrá el efecto completo que podría desear: habrá un cuello de botella en serie en el servidor de archivos y tener cientos de procesos que realizan solicitudes del servidor único no le dará factores de cientos de aceleración de hacerlo a través de un solo proceso. Aún así, podría ayudar hasta cierto punto, especialmente porque parece que el cuello de botella es leer en lugar de escribir, y será una gran mejora si su sistema se actualiza a un sistema de archivos completamente paralelo.
MPI-IO es de muy bajo nivel; vale la pena entender algo al respecto para saber qué está pasando "bajo el capó" con HDF5, NetCDF4 o ADIOS paralelos , pero usarlo usted mismo es realmente muy adecuado para datos binarios sin procesar donde la estructura es bien conocida en tiempo de compilación. HDF5 y NetCDF4 son mucho más flexibles.
Tenga en cuenta que si sus datos son relativamente simples, por ejemplo, las estructuras de big data son principalmente matrices o vectores n-dimensionales, recomiendo NetCDF4 (que también es paralelo y basado en HDF5) en lugar de HDF5; Es notablemente más simple de usar. HDF5 es más complicado y, a cambio de esa complejidad, permite modelos de datos muy complicados. Pero si esa es una característica que no necesita, es más rápido comenzar a usar NetCDF4.
En nuestro centro tenemos una clase de tarde y una clase de día sobre E / S paralelas donde hablamos sobre los conceptos básicos, MPI-IO, HDF5 y NetCDF4; Las diapositivas se pueden encontrar aquí .
fuente
Conseguimos una buena ampliación a todo el XT6 en ORNL usando MPI / IO para generar vectores. Aquí está el código . Los subsistemas de E / S para muchas máquinas no están diseñados para un paralelismo masivo, por lo que creo que @Dan está en lo cierto al tratar de minimizar las E / S escribiendo solo algunos pasos o alguna otra estrategia de aglomeración.
En cuanto a la escritura flexible de salida de forma escalable, tengo experiencia con XDMF , que puede realizarse mediante grandes escrituras binarias paralelas utilizando HDF5 (como PETSc VecView ) junto con una pequeña cantidad de código XML escrito en serie para describir el diseño. Esto puede leerse mediante paquetes de visualización como Paraview o MayaVi2 . Otra forma de hacerlo es usar el formato VTK con datos binarios adjuntos, sin embargo, esto requiere que sepa todo lo que desea escribir por adelantado.
fuente
Supongo que su problema de escalabilidad está relacionado con la salida y no con la entrada. La entrada paralela es bastante simple: lo que hago es que cada CPU abre el archivo NetCDF de entrada y lee la parte de la matriz que pertenece a su mosaico (puede haber un límite para cuántos lectores pueden abrir el mismo archivo NetCDF, pero no estoy seguro ) La salida paralela es más problemática.
Lo que estoy haciendo actualmente no es óptimo, pero funciona por ahora. Reúno todo en una CPU y hago la salida en serie. Mientras tanto, otros jugadores esperan a que termine el escritor. Esto funcionó bien para mí porque logré mantener el cálculo sobre la relación de salida bastante alto, por lo que la escalabilidad sería buena para más de 200 CPU. Pero esta no es la solución que estás buscando.
Otra solución es lo que sugirió Yann: escriba en serie en N archivos y haga que una CPU de dron ensamble los mosaicos en una sola pieza, si la RAM lo permite.
Además de las bibliotecas de E / S paralelas sugeridas en respuestas anteriores, es posible que también desee consultar Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , ya que ya se siente cómodo con NetCDF y MPI. No lo usé en la práctica, pero planeo ir en esa dirección cuando golpee la pared con recolección + E / S en serie.
fuente