我注意到,经常,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的答案是正确的。这在标准中没有规定。每个设备供应商都可以根据自己的需要来实现。分配后立即清零内存将为您节省很多麻烦。 –