Una reducción en paralelo supone que la operación correspondiente es asociativa. Esta suposición se viola para la adición de números de punto flotante. Puedes preguntar por qué me importa esto. Bueno, hace que los resultados sean menos reproducibles. Y empeora cuando el recocido simulado se usa para optimizar (o ajustar parámetros) sobre subrutinas que producen resultados no reproducibles.
¿Cuáles son las formas comunes de lidiar con este problema? ¿Qué se puede decir sobre las siguientes estrategias?
- No me importa la no reproducibilidad.
- No utilice la reducción paralela con números de coma flotante y suma.
- Cree paquetes de trabajo de tamaño adecuado de forma reproducible y realice la reducción final a mano.
- Utilizar una mayor precisión para la adición (pero no todos los compiladores ofrecen una mayor precisión los tipos de punto flotante).
parallel-computing
reproducibility
Thomas Klimpel
fuente
fuente
Respuestas:
Una reducción implementado usando
MPI_Allreduce()
es reproducible, siempre y cuando se utiliza el mismo número de procesadores, siempre que la aplicación observó la siguiente nota que aparece en la Sección 5.9.1 de la norma MPI-2.2.Si necesita reproducibilidad garantía a toda costa, puede seguir las instrucciones en el siguiente párrafo:
En el esquema más amplio de las cosas, algoritmos eficientes para la mayoría de las aplicaciones se aprovechan de la localidad. Dado que el algoritmo es muy diferente cuando se ejecuta en un número diferente de los procesos, es simplemente no es práctico para reproducir exactamente los resultados cuando se ejecuta en un número diferente de los procesos. Una posible excepción se multigrid con (por ejemplo, de Chebyshev) suavizadores polinómicas amortiguada Jacobi o, cuando es posible que este método sencillo para llevar a cabo muy bien.
Con el mismo número de los procesos, a menudo es beneficioso para el rendimiento a mensajes de proceso en el orden en que se reciben (por ejemplo, usando
MPI_Waitany()
), que introduce no determinismo. En tales casos, se puede implementar dos variantes, el ayuno que recibe en cualquier orden y una "depuración" que recibe en un orden estático. Esto requiere que todas las bibliotecas subyacentes también se escriben para ofrecer este comportamiento.Para la depuración en algunos casos, puede aislar parte de un cálculo que no ofrece este comportamiento reproducible y que realice de forma redundante. Dependiendo de cómo se diseñaron los componentes, que el cambio puede ser una pequeña cantidad de código o muy intrusivo.
fuente
Ídem para la respuesta más la parte I de Jed. Sin embargo, hay una salida diferente: Dado el tamaño de los números de punto flotante normales, puede almacenar cada número en un número de punto 4000-o-so de bits fija. Así que si usted hace una reducción en números de punto flotante por lo tanto incrustados, se obtiene un cálculo exacto, sin importar la asociatividad. (Lo siento, no tengo la referencia a quien se le ocurrió esta idea.)
fuente
Se puede implementar un algoritmo de reducción numéricamente estable en MPI lo mismo que se puede hacer en serie. Puede haber un impacto en el rendimiento, por supuesto. Si usted puede permitirse el lujo de replicar el vector, sólo tiene que utilizar MPI_Gather y hacer la reducción numéricamente estable en serie en la raíz. En algunos casos, es posible que el impacto en el rendimiento no es un gran problema.
Otra solución es utilizar anchos acumuladores como se describe aquí . Usted puede hacer esto con MPI como una reducción de usuario-define, aunque desarrollará mucho más ancho de banda.
Un compromiso para lo anterior es el uso de la suma compensada. Ver referencias “Kahan suma” para más detalles. “Higham de precisión y estabilidad numérica de algoritmos ” es un excelente recurso sobre este tema.
fuente
Para abordar la cuestión en el contexto de las discusiones sobre un sistema de memoria compartida, he escrito esta página que explica lo que hacemos en deal.II: http://dealii.org/developer/doxygen/deal.II/group__threads.html #MTWorkStream
fuente
Me gustaría señalar que en lugar de utilizar más alta precisión aritmética para la adición, existe la posibilidad de utilizar la suma compensada (ver [1]). Esto podría aumentar la precisión de la suma sin la necesidad de recurrir a tipos de datos más grandes.
[1] Higham, NJ La precisión de la suma del punto flotante. SIAM Journal on Scientific Computing 14, 783–799 (1993).
fuente