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

1''*_*1'' 8 opencl

我注意到,经常globalconstant设备内存初始化为0.这是一个普遍规律?我无法在标准中找到任何东西.

Cap*_*ous 9

不,不.例如,我有这个小内核来测试原子添加:

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

使用此主机代码(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)
Run Code Online (Sandbox Code Playgroud)

在使用我的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)
Run Code Online (Sandbox Code Playgroud)

在任何设备上一切正常.