我在我的OpenCL内核中遇到了奇怪的bug。基本上它是二进制排序升级到N != 2的幂。我所做的是检查主机上的序列是否正确排序,而让我来到这里的是答案不正确。
现在这个bug很难追踪,因为它是随机发生的。我每次都以相同的方式对生成的许多不同的序列进行排序,它只是发生了一个序列没有排序,然后是另一个。然而,高百分比的输出是正确的,而且我在for cycle中的主机实现也正确地对相同的输入进行了排序。最有趣的是,当我保持输入并在设备上再次运行它时,它突然被正确排序。
我想到了这可能是竞态条件,因为它的行为就是这样。然而,我在设备代码中没有这样的地方,所以唯一的可能性是主机。我有一个有序的队列,我的读写都阻塞了,所以这应该不会有问题,但是在执行内核之后我没有同步点。
是否需要这样的同步?OpenCL为有序队列提供了什么保证?我是否有可能在内核完成对同一内存块的所有操作之前进行阅读?
这种随机发生的唯一另一个想法是设备中的内存故障,但这是我接受的最后一个选择,所以我也欢迎使用OpenCL获得随机结果/错误的其他一些想法。
发布于 2012-08-23 17:13:41
根据规范,如果您有一个有序队列,您的内核和内存读/写将按照它们排队的顺序完成:请参阅clCreateCommandQueue here http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/。
如果你想100%确定是这样的话,你可以在内存读取之前将一个屏障排入队列。
https://stackoverflow.com/questions/12082999
复制相似问题