次のいずれかを実行しているNvidiaGTX580を搭載したMacProで同じOpenCLコードを実行しています。
- Xcode4.6を搭載したOSX10.8.2
- Visual C++2008エンタープライズおよびNvidiaCUDAツールキット5.0を搭載したWindowsXP32ビット
ただし、WinXPでは間違った結果が得られます。
使用する作業項目の数を定義するには、作業グループのサイズ(192)、作業グループの数(256)を指定し、作業グループのサイズx作業グループ(192 x 256 = 49152)として使用する作業項目のグローバル数を設定します。
これをAppleプラットフォームで実行すると、すべての結果が正しくなりますが、Win XPプラットフォームで実行すると、1/8倍の結果が得られます。
いくつかのチェックを行うと、GPUにグローバルサイズと思われるものを保存させ、期待数を49152として報告しますが、代わりに各ワークグループの最初のワークアイテムを取得してローカルサイズをカウンターにアトミックに追加すると、6144しか取得されません。グローバルサイズのちょうど1/8。
この問題は、設定された作業項目の数の関数のようであり、ワークグループのサイズを32または64に設定すると、正しい答えが得られます(ワークグループのサイズが192で一定に保たれている場合)。ただし、他の値の場合、この問題が発生し、使用する作業項目の数に応じて、結果が1 / 8、1 / 4、または1/2の係数でずれることがあります。
32ビットのアドレス制限やNVidiaライブラリの積極的な最適化のようにこれが発生する理由はありますか?