2013-08-29 36 views
8

我注意到,经常,globalconstant设备内存被初始化为0.这是一个通用规则吗?我无法在standard中找到任何内容。OpenCL是否始终将器件内存初始化为零?

+0

它可能已在PC上初始化为零,因为PC通常包含敏感或机密信息。在控制台上可能不会有这样的问题。 – Potatoswatter

+0

我的nbody模拟器在速度重置器出现之前爆炸了。 –

+0

CaptainObvious的答案是正确的。这在标准中没有规定。每个设备供应商都可以根据自己的需要来实现。分配后立即清零内存将为您节省很多麻烦。 –

回答

9

不,它不。比如我有这个小内核,以测试原子加:

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) 

一切在任何设备工作正常。

1

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

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

可能发生的情况是,典型的操作系统现在甚至不会使用现在1天的设备内存的1%。所以当你启动一个OpenCL的时候,你很可能会陷入一个空的区域。

+0

有趣的推理的答案。但是,内存通常在CPU上初始化为0。 –

+0

除调试模式外,内存通常不会被初始化。但是,如果启动任何系统,所有内存都将为零。如果不使用,将保持那样。据我所知,GPU内存很少使用。 – DarkZeros