El siguiente contenido puede ser sobre errores de cálculo en GPU.
Con suficiente tiempo, Intel i7-3610QM y una Nvidia GeForce GTX 660 estarán en desacuerdo entre sí con las mismas instrucciones. (Cuda 5.5, compute_20, sm_20)
Entonces, queda uno para concluir que uno de los dos comete un error.
Durante un estudio comparativo de factibilidad de simulación de partículas, noté que después de aproximadamente mil transformaciones de doble precisión (transformaciones que incluyen pecado, cos, multiplicación, división, suma y resta) los errores comenzaron a aparecer.
Te daré un pequeño extracto de números para comparar (el primer número siempre es CPU, la segunda GPU)
-1.4906010142701069
-1.4906010142701074
-161011564.55005690
-161011564.55005693
-0.13829959396003652
-0.13829959396003658
-16925804.720949132
-16925804.720949136
-36.506235247679221
-36.506235247679228
-3.3870884719850887
-3.3870884719850896
(tenga en cuenta que no todas las secuencias de transformación producen un error)
Si bien el error máximo es casi insignificante (0.0000000000000401%)
, todavía existe y contribuye al error acumulativo.
Ahora este error podría deberse a una diferencia en la implementación de una de las bibliotecas intrínsecas. De hecho, parece que la GPU prefiere redondear hacia abajo o truncar donde se redondea la CPU. Curiosamente, esto solo parece suceder en números negativos.
Pero el punto es que las instrucciones idénticas no necesariamente garantizan resultados idénticos, incluso en máquinas digitales.
Espero que esto haya contribuido.
EDITAR como nota al margen: en el caso de errores aritméticos de GPU, esto (ctrl + f "Primera GPU con soporte de memoria ECC") también podría ser de interés, aunque no necesariamente relevante para los errores anteriores.