Yo y mi Ph.D. un alumno ha encontrado un problema en un contexto de análisis de datos de física que podría utilizar para obtener información. Tenemos un código que analiza los datos de uno de los experimentos de LHC que brinda resultados irreproducibles. En particular, los resultados de los cálculos obtenidos del mismo binario, ejecutados en la misma máquina pueden diferir entre ejecuciones sucesivas. Somos conscientes de las muchas fuentes diferentes de irreproducibilidad, pero hemos excluido a los sospechosos habituales.Comparación de punto flotante irreproducibilidad
Hemos rastreado el problema hasta la irreproducibilidad de las operaciones de comparación de coma flotante (precisión doble) al comparar dos números que nominalmente tienen el mismo valor. Esto puede suceder ocasionalmente como resultado de los pasos previos en el análisis. Un ejemplo acabamos de encontrar un ejemplo que prueba si un número es menor que 0.3 (tenga en cuenta que NUNCA evaluamos la igualdad entre valores flotantes). Resulta que debido a la geometría del detector, era posible que el cálculo produjera ocasionalmente un resultado que sería exactamente 0.3 (o su representación de precisión doble más cercana).
Somos muy conscientes de las dificultades que existen al comparar los números de punto flotante y también con la posibilidad de que la precisión excesiva en la FPU afecte los resultados de la comparación. La pregunta que me gustaría responder es "¿por qué los resultados son irreproducibles?" ¿Es porque la carga de registro FPU u otras instrucciones FPU no están despejando los bits en exceso y, por lo tanto, los bits "sobrantes" de los cálculos anteriores están afectando los resultados? (Esto parece improbable) Vi una sugerencia en otro foro que el contexto cambia entre procesos o subprocesos también podría inducir un cambio en los resultados de comparación de coma flotante debido a que los contenidos de la FPU se almacenan en la pila y, por lo tanto, se truncan. Cualquier comentario sobre estas = u otras explicaciones posibles sería apreciado.
¿Podría agregar una referencia a la sugerencia sobre los interruptores de contexto? Aunque puedo imaginarme un procesador moviendo datos del acumulador y descartando bits, este mecanismo no parece una buena explicación para mí, y algunos detalles más podrían ser interesantes. –
Tal vez el uso de diferentes indicadores de optimización del compilador podría solucionar este problema. – tkerwin
@Coffee on Mars: Esa sería mi sugerencia, así que creo que puedo explicar :) El problema es que la FPU puede estar usando un mayor número de bits en sus registros, en algunos procesadores recientes hasta 80 bits para dobles. Ahora, en un entorno con un único hilo, la FPU podrá realizar todas las operaciones con esa precisión y obtendrá un resultado. Si agrega otros subprocesos/procesos a la mezcla, cuando el SO realiza el cambio de contexto, tiene que almacenar el valor del registro de 80 bits en un doble de 64 bits, perdiendo precisión. –