2013-08-29 67 views
8

我注意到,經常,globalconstant設備內存被初始化爲0.這是一個通用規則嗎?我無法在standard中找到任何內容。OpenCL是否始終將器件內存初始化爲零?

+0

它可能已在PC上初始化爲零,因爲PC通常包含敏感或機密信息。在控制檯上可能不會有這樣的問題。 – Potatoswatter

+0

我的nbody模擬器在速度重置器出現之前爆炸了。 –

+0

CaptainObvious的答案是正確的。這在標準中沒有規定。每個設備供應商都可以根據自己的需要來實現。分配後立即清零內存將爲您節省很多麻煩。 –

回答

9

不,它不。比如我有這個小內核,以測試原子加:

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

與此主機代碼(pyopencl +單元測試)調用它:用我的CPU時

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) 

總返回正確的值。但是在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) 

一切在任何設備工作正常。

1

據我所知,沒有標準中的句子說明這一點。 也許一些驅動程序的實現會自動完成,但是你不應該依賴它。

我記得一旦我有一個緩衝區未初始化爲0的情況,但我不記得「OS +驅動程序」的設置。

可能發生的情況是,典型的操作系統現在甚至不會使用現在1天的設備內存的1%。所以當你啓動一個OpenCL的時候,你很可能會陷入一個空的區域。

+0

有趣的推理的答案。但是,內存通常在CPU上初始化爲0。 –

+0

除調試模式外,內存通常不會被初始化。但是,如果啓動任何系統,所有內存都將爲零。如果不使用,將保持那樣。據我所知,GPU內存很少使用。 – DarkZeros