Ich habe einen OpenCL-Kernel für einige Berechnungen. Ich habe festgestellt, dass nur ein Thread mit CPU-Codes ein anderes Ergebnis liefert. Ich benutze vs2010 x64 Freigabemodus.OpenCL Kernel Float Division gibt unterschiedliche Ergebnisse
Durch die Überprüfung der OpenCL-Codes durch einige Beispiele, fand ich einige interessante Ergebnisse. Hier sind die Testbeispiele in Kernel-Codes.
float fval = (10296184.0)/(float)(x*y*z); // which gives result fval = 3351.6225585938
float fval = (10296184.0f)/(float)(x*y*z); // which gives result fval = 3351.6225585938
Variablen sind:: int x,y, z
von einigen Operationen Diese Werte werden berechnet
I 3 Fällen in OpenCL Kernel getestet wird die Präzision durch printf("%.10f", fval);
Fall 1 geprüft. Und ihre Werte sind x = 12, y = 16, z = 16;
Fall 2:
float fval = (10296184.0)/(float)(12*16*16); // which gives result fval = 3351.6223144531
float fval = (10296184.0f)/(float)(12*16*16); // which gives result fval = 3351.6223144531
Fall 3:
Wenn ich jedoch die Differenz der fval
durch Verwendung beiden obigen Ausdrücke zu berechnen, ist das Ergebnis 0, wenn 10296184.0
verwenden.
float fval = (10296184.0)/(float)(x*y*z) - (10296184.0)/(float)(12*16*16); // which gives result fval = 0.0000000000
float fval = (10296184.0f)/(float)(x*y*z) - (10296184.0f)/(float)(12*16*16); // which gives result fval = 0.0001812663
Könnte jemand den Grund erklären oder einige Hinweise geben Sie mir?
Siehe [Ist Fließkomma-Mathematik gebrochen] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken)? Diese Ungenauigkeiten sind ein Grund, warum ich immer 'double' benutze (obwohl es dasselbe erleidet), es sei denn, ein Zwang zwingt mich, den minderwertigen' float' zu verwenden. –
Wenn Sie mehr Präzision als das benötigen, ist Double-Precision-FP ein Ding auf GPUs. Es hat sehr wenig Anwendung beim Rendern. –
Geben Sie an, wie die Werte von '3351.6226, 3351.6223 und 0' ermittelt wurden. 'printf ("% f ", ...)', Debugger, etc. – chux