不,不.例如,我有这个小内核来测试原子添加:
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)
在任何设备上一切正常.
| 归档时间: |
|
| 查看次数: |
2424 次 |
| 最近记录: |