我注意到,經常,global
和constant
設備內存被初始化爲0.這是一個通用規則嗎?我無法在standard中找到任何內容。OpenCL是否始終將器件內存初始化爲零?
回答
不,它不。比如我有這個小內核,以測試原子加:
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)
一切在任何設備工作正常。
據我所知,沒有標準中的句子說明這一點。 也許一些驅動程序的實現會自動完成,但是你不應該依賴它。
我記得一旦我有一個緩衝區未初始化爲0的情況,但我不記得「OS +驅動程序」的設置。
可能發生的情況是,典型的操作系統現在甚至不會使用現在1天的設備內存的1%。所以當你啓動一個OpenCL的時候,你很可能會陷入一個空的區域。
有趣的推理的答案。但是,內存通常在CPU上初始化爲0。 –
除調試模式外,內存通常不會被初始化。但是,如果啓動任何系統,所有內存都將爲零。如果不使用,將保持那樣。據我所知,GPU內存很少使用。 – DarkZeros
- 1. C中的全局變量是否始終初始化爲零?
- 2. 是否始終將ints初始化爲0?
- 3. 檢查內存是否已初始化
- 4. 全局變量始終初始化爲零
- 5. Windows XP是否自動將數組初始化爲零?
- 6. gcc是否自動將靜態變量初始化爲零?
- 7. 將字段值初始化爲零?
- 8. 指針是否始終設置爲零?
- 9. detailViewController.navigationController始終是零
- 10. SFUserAccount始終是零
- 11. UNIX初始化進程是否始終運行
- 12. 在C中初始化內存爲零意味着什麼?
- 13. 釋放內存初始化
- 14. TableView始終爲零
- 15. navigationController始終爲零
- 16. table.scrollleft始終爲零
- 17. CFReadStreamRef始終爲零
- 18. gl_PointCoord始終爲零
- 19. FBSDKAccessToken.currentAccessToken始終爲零
- 20. ParseInt始終爲零
- 21. FBSession.session.accessTokenData.userID始終爲零
- 22. SegmentedControl始終爲零
- 23. ASP:repeater.items.count始終爲零
- 24. 字符串文字是否計算爲部分初始化器並進行零初始化?
- 25. 初始化內置類型初始化
- 26. 初始化對象時,實例變量始終未初始化?
- 27. free()的內存初始化爲0
- 28. LLVM是否爲初始類型初始化局部變量?
- 29. JMockit是否初始化EJB?
- 30. 用來初始化用零
它可能已在PC上初始化爲零,因爲PC通常包含敏感或機密信息。在控制檯上可能不會有這樣的問題。 – Potatoswatter
我的nbody模擬器在速度重置器出現之前爆炸了。 –
CaptainObvious的答案是正確的。這在標準中沒有規定。每個設備供應商都可以根據自己的需要來實現。分配後立即清零內存將爲您節省很多麻煩。 –