1

次のいずれかを実行している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ライブラリの積極的な最適化のようにこれが発生する理由はありますか?

4

1 に答える 1

0

In the Apple OpenCL library global write only memory is initialised to 0 for numeric data types, in the windows Nvidia library global write only memory is not initialised.

Therefore when counters in global memory were incremented there starting value was undefined. When this was suspected a quick and foolish initialisation loop was put at the start of the kernel, this of course resulted in workgroups executed later zeroing the results workgroups executed earlier giving the observed reduction in the result in proportion to the number of kernels executed on each compute unit.

于 2013-02-17T21:34:01.653 に答える