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_REDUCE
se 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.