OpenCL最佳实践指南(https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf)建议在3.1.3节中使用clFlush以确保命令以正确的顺序发生,例如在数据传输之前不会发生处理:
clFlush 对于queue0clFlush 对于queue0和queue1clFlush 对他们两个这里的回复/sf/answers/867279941/建议使用事件来实现,看起来是一样的.
我的问题是:我是否做对了,并且clFlush在这种情况下两者都做了同样的事情(避免同时执行)?使用哪一个是否重要?
小智 5
clFlush仅确保enqueue函数将数据传输或内核执行排入队列,但它不能确保您调用的函数已完成.在多种情况下您需要使用事件:
1 - 如果您使用非阻塞调用数据传输,则需要使用事件来确保在开始执行内核之前已完成所有事件的传输,并且在复制回主机时,需要等待读取事件完成.
2 - 如果您在两个队列中执行的内核之间存在依赖关系,那么您必须再次使用事件以正确的方式对内核进行排序.
所以你的问题取决于你在内核执行之间有什么样的依赖关系,以及你是否使用非阻塞调用来传输数据.如果您没有依赖项并且正在使用阻塞调用进行数据传输,clFlush将完成这项工作.否则,你需要活动.
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |