¿Las mejores metodologías para gestionar una malla en la computación de elementos finitos paralelos?

11

Actualmente estoy desarrollando un método de descomposición de dominio para la solución del problema de dispersión. Básicamente estoy resolviendo un sistema de Helmholtz BVP de forma iterativa. Discreto las ecuaciones usando el método de elementos finitos sobre mallas triangulares o tetraédricas. Estoy desarrollando el código para mi tesis doctoral. Soy consciente de algunas de las bibliotecas de elementos finitos existentes, como deal.ii o DUNE, y aunque creo que son geniales, con un diseño inspirador y API, para fines de aprendizaje, quería desarrollar mi propia pequeña aplicación desde cero.

Estoy en un punto en el que tengo mis versiones en serie ejecutándose y ahora quiero paralelizarlas. Después de todo, uno de los puntos fuertes del marco de descomposición de dominio es formular algoritmos que sean fáciles de paralelizar, al menos en principio. En la práctica, sin embargo, hay muchos detalles que uno debe considerar. La gestión de la malla es una de ellas. Si las aplicaciones van a lograr una alta resolución mientras se escala bien a muchas CPU, la replicación de una malla completa en cada CPU es ineficiente.

Quería preguntar a los desarrolladores que trabajan en aplicaciones similares en entornos informáticos de alto rendimiento cómo abordan este problema.

Hay una biblioteca p4est para la gestión de mallas distribuidas. No necesito AMR, por lo que podría ser una exageración ya que solo estoy interesado en usar mallas uniformes y no estoy seguro de si puede refinar mallas triangulares. También podría simplemente crear una malla uniforme, luego alimentarla en uno de los divisores de malla y hacer un procesamiento posterior de la salida.

El enfoque más simple parece crear un archivo separado para cada partición que contiene información de malla relevante solo para esa partición en particular. Este archivo sería leído por una sola CPU que sería responsable del ensamblaje del sistema discreto en esa parte de la malla. Por supuesto, alguna información de vecindad / conectividad de partición global también necesitaría ser almacenada en un archivo leído por todas las CPU para la comunicación entre procesos.

¿Qué otros enfoques hay por ahí? Si algunos de ustedes pudieran compartir, ¿cuáles son algunas de las metodologías comúnmente utilizadas en la industria o las instituciones gubernamentales de investigación relacionadas con el manejo de este problema? Soy bastante nuevo en la programación de un solucionador de elementos finitos paralelos y quería tener una idea de si estoy pensando o no en este problema correctamente y cómo otros lo están abordando. Cualquier consejo o sugerencia para artículos de investigación relevantes sería muy apreciado.

¡Gracias por adelantado!

midurad
fuente
Si está buscando un separador de malla, METIS sería una buena opción. Consulte también ParMETIS. Administrar mallas es una historia diferente, ITAPS iMesh puede ser la solución para usted. Verifique también las respuestas a mi pregunta aquí: scicomp.stackexchange.com/questions/4750/…
Krzysztof Bzowski
@KrzysztofBzowski: ¿ha utilizado quizás la biblioteca escocesa también? Me preguntaba cuál es la diferencia entre Scotch y Metis cuando se trata de elementos finitos. El proyecto iMesh parece muy interesante. Leeré más sobre esto en los próximos días. Sé sobre Deal.II y DUNE. Recuerdo haber buscado en openMesh hace algún tiempo, pero pensé que sería más fácil implementar la funcionalidad que necesitaba desde cero. Para mallas secuenciales, básicamente adapté la estructura de datos de medio borde / cara presentada en este enlace de papel ¡Gracias!
midurad

Respuestas:

7

Si no está utilizando AMR y no desea escalar más allá de los núcleos 1K-4K, simplemente haga esto.

  1. El rango 0 lee toda la malla y la divide usando METIS / Scotch, etc. (Nota: Esta es una operación en serie).

  2. El rango 0 difunde la información de partición del elemento / nodo a todos los demás rangos y libera la memoria (utilizada para almacenar la malla)

  3. Todos los rangos leen los nodos / elementos que poseen (incluidos los nodos fantasmas) del mismo archivo de entrada (Nota: 2000 rangos que acceden al mismo archivo de entrada pueden sonar lentos pero no son prácticos, aunque puede ser malo para el sistema de archivos, pero luego lo están haciendo solo una vez).

  4. Todos los rangos deben crear las asignaciones locales / globales de nodo / elemento / dof para la aplicación de BC y el ensamblaje de matrices y renumerar los nodos.

Después de que todo esté dicho y hecho, todos los datos en un rango serán locales, por lo que debería poder escalar bien (en cuanto a memoria). Hago todo esto en aproximadamente 100 líneas (ver líneas 35-132 aquí ) en un pequeño código mío.

Ahora, si su malla es demasiado grande (por ejemplo,> 100-250 millones de elementos) que no puede particionar usando METIS en un solo nodo y necesita ParMETIS / PT-Scotch, entonces tiene el trabajo adicional de particionarlo en paralelo antes de todos los núcleos / los rangos pueden leerlo. En tal escenario, podría ser más fácil mantener la fase de partición separada del código principal por razones logísticas.

Por cierto, las bibliotecas de AMR generalmente no hacen pruebas. También PETSc es una buena opción para la paralelización de su código.

Editar: También vea aquí y aquí .

stali
fuente
¡Gracias por compartir tu código! Lo más probable es que tome la ruta que ha descrito anteriormente. Parece el menos complicado y ya tengo una idea de cómo hacerlo. Además, será un buen ejercicio en la programación MPI. Usted mencionó que las librerías AMR generalmente no manejan las pruebas. ¿Sería porque un refinamiento ingenuo, por ejemplo, en un árbol cuádruple de mallas triangulares podría conducir a una malla de mala calidad? Refinar quads parece fácil, pero dividir un tet en cuatro parece difícil si uno quiere preservar la calidad. ¿Existe quizás un contenedor C ++ para PETSc? Puedo usar C, pero C ++ sería mejor.
midurad
@midurad Si prefiere C ++ sobre C, debería considerar Trilinos, que es una biblioteca de C ++ comparable a PETSc. Además, Trilinos tiene un paquete (Zoltan) que puede usar para realizar particiones de malla.
Dr_Sam
@midurad Solo necesita muy pocas llamadas MPI si usa PETSc. La refinación de las pruebas debe ser fácil, pero tratar (eficientemente) con las estructuras de datos dinámicos asociados puede requerir un poco de reflexión y trabajo. Debería poder usar PETSc con C ++, pero dados sus requisitos, libmesh podría ser una opción viable (creo que es compatible con AMR y tets).
stali
Gracias por toda la información. Eso fue muy útil.
midurad
2

Puede que esto no te sorprenda dado que desarrollo el acuerdo. II, pero aquí está mi perspectiva: cuando hablo con los estudiantes, generalmente les digo que desarrollen su propio prototipo al principio para que puedan ver cómo se hace. Pero luego, una vez que tienen algo pequeño funcionando, les hago usar una biblioteca que les permite ir mucho más lejos porque no tienen que reinventar la rueda básicamente con cada paso que dan.

En su caso, ya ha visto cómo implementar un solucionador Helmholtz simple. Pero pasará los próximos 6 meses escribiendo el código necesario para hacerlo en paralelo, pasará otros 3 meses si desea usar geometrías más complicadas. Luego pasará 6 meses más si desea un solucionador eficiente. Y todo este tiempo estás escribiendo código que ya ha sido escrito por otra persona y que, en cierto sentido, no te acerca más a lo que realmente necesitas hacer para tu doctorado: desarrollar algo nuevo que no haya sido hecho antes. Si sigue este camino, pasará 2-3 años de su tiempo de doctorado rehaciendo lo que otros han hecho, y tal vez 1 año haciendo algo nuevo.

La alternativa es que ahora pasa 6 meses aprendiendo una de las bibliotecas existentes, pero después de eso tendrá 2-3 años donde realmente hace cosas nuevas, cosas en las que cada dos semanas puede ingresar a la oficina de su asesor y mostrarle / ella es algo realmente nuevo, que se ejecuta en escalas masivamente grandes, o simplemente es muy bueno en otros aspectos. Creo que probablemente ya ve a dónde voy con esto.

Wolfgang Bangerth
fuente
3
Pregunta sincera, ya que claramente eres una autoridad en esto: ¿quién va a escribir la próxima generación de marcos como deal.ii si nadie en la actual cosecha de estudiantes de doctorado aborda problemas como este? Ya estamos viendo una tendencia problemática de los estudiantes de doctorado entrantes que nunca han compilado un programa. Es un poco inquietante para mí que las habilidades promedio de desarrollo de código parecen estar en una disminución continua en los científicos computacionales.
Aurelius
1
Es una pregunta justa. Necesitas estudiantes de posgrado tan obstinados y tercos como yo :-) Pero mi respuesta es que solo porque probablemente necesitemos algunas personas que lo hagan, eso no significa que debamos alentar a todos a pasar años de sus vidas repitiendo lo que otros ya han implementado.
Wolfgang Bangerth
2
Sí, justo lo suficiente. En mi opinión, lo más importante que ha frenado el mundo de la investigación de CFD en los últimos 20 años ha sido la falta de talento en ingeniería de software y el rechazo de las prácticas modernas de software por parte de los Greybeards. Dejando a un lado los marcos, muchos estudiantes de doctorado se ven retenidos por el mal código heredado y la incapacidad de construir rápidamente las complejas piezas de software necesarias para los métodos numéricos modernos en el hardware moderno.
Aurelius
No estoy en desacuerdo con la declaración sobre las barbas grises (aunque la mía también se está volviendo gris en estos días ...). Pero también ven que tienes que elegir entre códigos heredados crudos o reinventar la rueda cuando tienes un nuevo estudiante graduado. Muy pocas personas disfrutan de tener éxito con el software que escriben (no obstante el autor actual), y no desea enviar a un prometedor estudiante de posgrado por ese camino si no sabe que puede hacer una carrera de eso.
Wolfgang Bangerth
0

Esta no es una respuesta completa.

Para la implementación de métodos de descomposición de dominio paralelo, encontré algunas complicaciones. Primero, uno puede usar muchos procesadores para un subdominio o alimentar un procesador con muchos subdominios y uno puede implementar ambos paradigmas. En segundo lugar, la forma subestructurada de los métodos de descomposición del dominio requiere separar las caras, aristas y vértices de los subdominios (no los elementos). No creo que estas complicaciones se incluyan fácilmente en el manejo de la malla paralela. La situación se vuelve más simple si considera un procesador para un subdominio y utiliza el método superpuesto RAS / RASHO. Incluso en este caso, será mejor que gestiones tu diseño paralelo tú mismo,

Hui Zhang
fuente