我注意到通常情况下,global
和constant
设备内存被初始化为0。这是一条普遍的规则吗?我在标准文档中没有找到相关说明。
我注意到通常情况下,global
和constant
设备内存被初始化为0。这是一条普遍的规则吗?我在标准文档中没有找到相关说明。
kernel void atomicAdd(volatile global int *result){
atomic_add(&result[0], 1);
}
使用这个宿主代码(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)
out_buf = cl.Buffer(self.ctx, self.mf.WRITE_ONLY | self.mf.COPY_HOST_PTR, hostbuf=result)
所有设备上都一切正常。
这取决于您正在开发的平台。正如@DarkZeros在之前的回答中提到的,规范并没有暗示任何内容。请参阅OpenCL 2.1 Spec的第104页。
然而,根据我们在Mali GPU上的经验,驱动程序会将新分配的缓冲区的所有元素初始化为零。这是为了第一次触摸。随着时间的推移,当我们释放此缓冲区并且其内存空间被新缓冲区占用时,该内存空间不会被初始化为零。“同样,第一次触摸会看到零值。之后,您会看到正常的无意义值。”
希望这可以在这么长的时间后对您有所帮助!