アップデート:
この例を他のシステムで実行しました。Intel i7-3630QM、Intel HD4000、および Radeon HD 7630M では、すべての結果は同じです。i7-4700MQ / 4800MQ では、OpenCL または 64 ビット gcc を 32 ビット gcc から使用すると、CPU の結果が異なります。これは、デフォルトで SSE を使用する 64 ビット gcc および OpenCl と、387 math を使用する 32 ビット gcc の結果です。-mfpmath=387 が設定されている場合、少なくとも 64 ビット gcc は同じ結果を生成します。そのため、さらに多くの情報を読み、x86 浮動小数点を試してみる必要があります。回答ありがとうございます。
「CUDA と OpenCL のプログラミング: 最新の C++ ライブラリを使用したケーススタディ」の Lorenz システムの例を、それぞれ異なる OpenCL デバイス上の 10 個のシステムに対して実行しましたが、異なる結果が得られています。
Quadro K1100M (NVIDIA CUDA)
r => xyz
0.100000 => -0.000000 -0.000000 0.000000
5.644444 => -3.519254 -3.5192504.644452 11.188890
=> 5.212534 5.212530 10.188904 16.73334
= 6.4734 = 6.4734 = 6.4734 = 6.4734 = 6.473433737373737373737373737373734367373737347334>22.277779 => 3.178553 2.579687 17.946903
27.822224 => 5.008720 7.753564 16.377680
33.366669 => -13.381100 -15.252210 36.107887
38.911114 => 4.256534 6.813675 23.838787
44.455555 => -11.083726 0.691549 53.632290
50.000000 => -8.624105 -15.728293 32.516193インテル(R) HD グラフィックス 4600 (インテル(R) OpenCL)
r => xyz
0.100000 => -0.000000 -0.000000 0.000000
5.644444 => -3.519253 -3.519250 4.644451
11.1888890 => 5.212531 5.212538 10.188888888888888888888890
16.733334 = 15.47326> 15.47326> 15.4732622.277779 => 7.246771 7.398651 20.735369
27.822224 => -6.295782 -10.615027 14.646572
33.366669 => -4.132523 -7.773201 14.292910
38.911114 => 14.183139 19.582197 37.943520
44.455555 => -3.129006 7.564254 45.736408
50.000000 => -9.146419 -17.006729 32.976696Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz (Intel(R) OpenCL)
r => xyz
0.100000 => -0.000000 -0.000000 0.000000
5.644444 => -3.519254 -3.519251 4.644453
11.188890 => 5.212513 5.212507 10.188900
16.733334 = 6.4734 = 6.4734 =>22.277779 => -8.295195 -8.198518 22.271002
27.822224 => -4.329878 -4.022876 22.573458
33.366669 => 9.702943 3.997370 38.659538
38.911114 => 16.105495 14.401397 48.537579
44.455555 => -12.551083 -9.239071 49.378693
50.000000 => 7.377638 3.447747 47.542763
ご覧のとおり、3 つのデバイスは R=16.733334 までの値で一致し、その後発散し始めます。
VexCL なしで odeint を使用して同じ領域を実行し、CPU 実行で OpenCL の結果に近い結果を得ました。
バニラ風味:
R => x y z
16.733334 => 6.47731 6.47731 15.7333
22.277779 => -8.55303 -6.72512 24.7049
27.822224 => 3.88874 3.72254 21.8227
サンプル コードは次の場所にあります: https://github.com/ddemidov/gpgpu_with_modern_cpp/blob/master/src/lorenz_ensemble/vexcl_lorenz_ensemble.cpp
ここで何を見ているのかわからないのですか?CPU の結果は互いに非常に近いため、GPU の問題のように見えますが、私は OpenCL の初心者なので、この根本的な原因を見つける方法についていくつかの指針が必要です。