OpenCL总是零初始化设备内存吗?

OpenCL总是零初始化设备内存吗?,opencl,Opencl,我注意到,global和constant设备内存通常被初始化为0。这是普遍规律吗?我没能在房间里找到任何东西 据我所知,标准中没有一句话说明这一点。 也许一些驱动程序实现会自动完成这项工作,但您不应该依赖它 我记得有一次我遇到一个缓冲区未初始化为0的情况,但我记不起“OS+驱动程序”的设置 可能正在发生的是,典型的操作系统甚至不使用现在每天1%的设备内存。因此,当您启动OpenCL时,您很可能会陷入一个空白区域。不,它不会。例如,我有一个小内核来测试原子添加: kernel void atomi

我注意到,
global
constant
设备内存通常被初始化为0。这是普遍规律吗?我没能在房间里找到任何东西

据我所知,标准中没有一句话说明这一点。 也许一些驱动程序实现会自动完成这项工作,但您不应该依赖它

我记得有一次我遇到一个缓冲区未初始化为0的情况,但我记不起“OS+驱动程序”的设置


可能正在发生的是,典型的操作系统甚至不使用现在每天1%的设备内存。因此,当您启动OpenCL时,您很可能会陷入一个空白区域。

不,它不会。例如,我有一个小内核来测试原子添加:

kernel void atomicAdd(volatile global int *result){
    atomic_add(&result[0], 1);
}
使用以下主机代码调用它(pyopencl+unittest):

在使用我的CPU时总是返回正确的值。然而,在ATI HD 5450上,返回值总是垃圾

如果我记得清楚的话,在NVIDIA上,第一次运行返回的是正确的值,即16,但在下一次运行中,值是32、48等等。它使用的是相同的位置,旧值仍然存储在那里

当我用此行更正主机代码时(将0值复制到缓冲区):


在任何设备上都可以正常工作。

这取决于您正在开发的平台。正如前面的回答中提到的@DarkZeros,规范并不意味着任何东西。请参见第104页,共页

但是,根据我们在Mali GPU中的经验,驱动程序将新分配的缓冲区的所有元素初始化为零。这是第一次接触。稍后,随着时间的推移,我们释放这个缓冲区,它的内存空间被一个新的缓冲区占用,这个内存空间并没有初始化为零。同样,第一次触摸会看到零值。之后,你会看到正常的乱码值


希望这有助于这么长时间后

它可能在PC上初始化为零,因为PC通常包含敏感或机密信息。在控制台上可能不会有这样的问题。我的nbody模拟器在速度重置器出现之前爆炸了。船长显然答案是正确的。本标准未对其进行规定。每个设备供应商都可以根据自己的需要进行此操作。分配后立即将内存归零将为您节省很多麻烦。答案的推理很有趣。但是,CPU上的内存通常也初始化为0。除了在调试模式下,内存通常不会初始化。但是,如果启动任何系统,所有内存都将为零。如果不使用,将保持不变。据我所知,GPU内存很少使用。
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)
out_buf = cl.Buffer(self.ctx, self.mf.WRITE_ONLY | self.mf.COPY_HOST_PTR, hostbuf=result)