1

我的 OpenCL 内核遇到了奇怪的错误。基本上它是双音排序升级到 N != pow of 2。我所做的是我检查主机是否正确排序了序列,而将我带到这里的是答案不是。

现在这个错误很难追踪,因为它是随机发生的。我对许多不同的序列进行排序,每次生成的序列都以相同的方式排序,只是发生一个序列未排序,然后是另一个序列。但是,高百分比的输出是正确的,而且我在 for 循环中的主机实现对相同的输入进行了正确的排序。最有趣的是,当我保持输入并再次在设备上运行它时,它突然被正确排序。

我想到这可能是竞争条件,因为它的行为就是这样。但是我在设备代码中没有这样的地方,所以唯一的可能是主机。我有有序队列,并且我的读写被阻塞,所以应该没有问题,但是在执行内核后我没有同步点。

需要这样的同步吗?OpenCL 对有序队列有什么保证?我是否可能在内核完成对同一内存块的所有操作之前阅读?

这种随机事件的唯一其他想法是设备中的内存错误,但这是我接受的最后一个选项,所以我也欢迎一些其他想法,即何时使用 OpenCL 获得随机结果/错误。

4

1 回答 1

1

根据规范,如果您有一个有序队列,您的内核和内存读取/写入将按照它们排队的顺序完成:请参阅此处的 clCreateCommandQueue http://www.khronos.org/registry/cl/sdk /1.1/docs/man/xhtml/

如果您想 100% 确定是这种情况,您可以在读取内存之前将屏障排入队列。

于 2012-08-23T09:13:41.267 回答