O conteúdo a seguir pode ser sobre erros de cálculo nas GPUs.
Com tempo suficiente, o Intel i7-3610QM e uma Nvidia GeForce GTX 660 discordarão entre si, com as mesmas instruções. (cuda 5.5, computação_20, sm_20)
Portanto, resta-se concluir que um dos dois comete um erro.
Durante um estudo de viabilidade de simulação de partículas, notei que, depois de mil ou duas transformações de precisão dupla (transformações incluindo pecado, cos, multiplicação, divisão, adição e subtração), começaram a aparecer.
Vou dar um pequeno trecho de números para comparar (o primeiro número é sempre CPU, a 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
(observe que nem toda sequência de transformação gera um erro)
Embora o erro máximo seja quase insignificante, (0.0000000000000401%)
ele ainda existe e contribui para erros cumulativos.
Agora, esse erro pode ocorrer devido a uma diferença na implementação de uma das bibliotecas intrínsecas. De fato, parece que a GPU prefere arredondar para baixo ou truncar onde a CPU é arredondada. Curiosamente também, isso parece acontecer apenas em números negativos.
Mas o ponto é que instruções idênticas não são necessariamente garantidas para retornar resultados idênticos, mesmo em máquinas digitais.
Espero que isso tenha contribuído.
EDITAR como nota explicativa: No caso de erros aritméticos da GPU, esta (ctrl + f "Primeira GPU com suporte a memória ECC") também pode ser interessante, embora não seja necessariamente relevante para os erros acima.