9

globalデバイスのメモリが 0に初期化されていることによく気づきましたconstant。これは普遍的なルールですか? 標準で何も見つかりませんでした。

4

3 に答える 3

10

いいえ、そうではありません。たとえば、アトミックな追加をテストするために、この小さなカーネルを使用しました。

kernel void atomicAdd(volatile global int *result){
    atomic_add(&result[0], 1);
}

このホスト コード (pyopencl + unittest) で呼び出す:

def test_atomic_add(self):
    NDRange = (4, 4)
    result = np.zeros(1, dtype=np.int32)        
    out_buf = cl.Buffer(self.ctx, self.mf.WRITE_ONLY, size=result.nbytes)
    self.prog.atomicAdd(self.queue, NDRange, NDRange, out_buf)
    cl.enqueue_copy(self.queue, result, out_buf).wait()
    self.assertEqual(result, 16)

CPUを使用しているときに常に正しい値を返していました。ただし、ATI HD 5450 では、戻り値は常にジャンクでした。

そして、よく思い出せば、NVIDIA での最初の実行では正しい値、つまり 16 が返されましたが、次の実行では、値は 32、48 などでした。古い値がまだそこに保存されている同じ場所を再利用していました。

ホスト コードを次の行で修正したとき (値 0 をバッファーにコピー):

out_buf = cl.Buffer(self.ctx, self.mf.WRITE_ONLY | self.mf.COPY_HOST_PTR, hostbuf=result)

すべてがどのデバイスでも正常に機能しました。

于 2013-08-29T08:57:16.393 に答える
2

私の知る限り、これを述べている標準文はありません。ドライバーの実装によっては、これを自動的に行う場合もありますが、それに依存するべきではありません。

以前、バッファが0に初期化されていないケースがあった記憶がありますが、「OS + ドライバ」の設定が思い出せません。

おそらく何が起こっているのかというと、典型的な OS は現在のデバイスのメモリの 1% も使用していないということです。そのため、OpenCL を開始すると、空のゾーンに陥る可能性が非常に高くなります。

于 2013-08-29T08:28:39.863 に答える