Cómo abordar la no asociatividad numérico para la reducción paralela?


17

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).

¿Le preocupa la reproducibilidad en el mismo número de procesos o reproducibilidad en un número diferente de procesadores? ¿Cuánto de un impacto en el rendimiento que está dispuesto a tomar para la reproducibilidad bit a bit? ¿Está interesado sólo en el recocido simulado?
Jed Brown

@JedBrown estoy preocupado por la posibilidad de obtener resultados reproducibles, por ejemplo con el fin de depurar problemas potenciales. Bien sea para mí si hay una manera de reproducir los resultados, por ejemplo, utilizando el mismo número de procesadores (o simplemente "saber" el número de procesadores utilizado originalmente). Yo estaría dispuesto a tomar el impacto de rendimiento asociados con el uso de una mayor precisión los tipos de punto flotante para la adición en sí. Mis problemas concretos eran en su mayoría relacionados con el recocido simulado y diferencias inesperadas, pero todos ellos resultaron ser errores reales.
Thomas Klimpel

Respuestas:


15

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.

Asesoramiento a los ejecutores . Se recomienda encarecidamente que MPI_REDUCEse efectúen de manera que se obtenga el mismo resultado cada vez que se aplica la función en los mismos argumentos, que aparecen en el mismo orden. Tenga en cuenta que esto puede evitar optimizaciones que aprovechan la ubicación física de los procesadores. ( Fin de asesoramiento a los ejecutores .)

Si necesita reproducibilidad garantía a toda costa, puede seguir las instrucciones en el siguiente párrafo:

Asesoramiento a los usuarios . Es posible que algunas aplicaciones no puedan ignorar la naturaleza no asociativa de las operaciones de punto flotante o pueden usar operaciones definidas por el usuario (consulte la Sección 5.9.5) que requieren un orden de reducción especial y no pueden tratarse como asociativas. Tales aplicaciones deben cumplir la orden de la evaluación de forma explícita. Por ejemplo, en el caso de operaciones que requieren un estricto orden de evaluación de izquierda a derecha (o de derecha a izquierda), esto podría hacerse reuniendo todos los operandos en un solo proceso (por ejemplo, con MPI_GATHER), aplicando la operación de reducción en el orden deseado (por ejemplo, con MPI_REDUCE_LOCAL), y si es necesario, de difusión o de dispersión el resultado a los otros procesos (por ejemplo, con MPI_BCAST). ( Fin de asesoramiento a los usuarios .)

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.


6

Í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.)


1
No creo que haya sido el primero, pero su colega, el Dr. Bandwidth, ciertamente tiene una buena reseña sobre este tema: sites.utexas.edu/jdm4372/2012/02/15/…
Jeff

5

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.



2

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).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.