重叠传输和执行:确保命令以正确的顺序执行
Overlapping transfer and execution: ensure that commands are performed in the right order
OpenCL 最佳实践指南 (https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf) 在第 3.1.3 节中建议使用 clFlush
来确保命令以正确的顺序发生,例如数据传输前不进行处理:
- 传输 queue0 的数据
clFlush
队列 0
- 运行 queue0 的内核,为queue1 传输数据
clFlush
队列 0 和队列 1
- 运行 queue1 的内核并检索 queue0 的数据
clFlush
他们俩
- 检索队列 1 的数据
这里的回复建议用事件来实现,好像一样
我的问题是:在这种情况下,我做对了吗? clFlush
和事件是否服务于相同的目的(避免同时执行)?使用哪一个重要吗?
clFlush只保证入队函数入队数据传输或者内核执行,不保证你调用的函数完成。有多种情况需要使用事件:
1 - 如果您对数据传输使用非阻塞调用,则需要使用事件来确保在开始执行内核之前以及复制回宿主,您需要等待读取事件完成。
2 - 如果您在两个队列中执行的内核之间存在依赖关系,那么您必须再次使用事件以正确的方式对内核进行排序。
所以你的问题取决于你在内核执行之间有什么样的依赖关系,以及你是否使用非阻塞调用来传输数据。如果您没有依赖项并且您正在使用阻塞调用进行数据传输,clFlush 将完成这项工作。否则,您需要活动。
OpenCL 最佳实践指南 (https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf) 在第 3.1.3 节中建议使用 clFlush
来确保命令以正确的顺序发生,例如数据传输前不进行处理:
- 传输 queue0 的数据
clFlush
队列 0- 运行 queue0 的内核,为queue1 传输数据
clFlush
队列 0 和队列 1- 运行 queue1 的内核并检索 queue0 的数据
clFlush
他们俩- 检索队列 1 的数据
这里的回复建议用事件来实现,好像一样
我的问题是:在这种情况下,我做对了吗? clFlush
和事件是否服务于相同的目的(避免同时执行)?使用哪一个重要吗?
clFlush只保证入队函数入队数据传输或者内核执行,不保证你调用的函数完成。有多种情况需要使用事件:
1 - 如果您对数据传输使用非阻塞调用,则需要使用事件来确保在开始执行内核之前以及复制回宿主,您需要等待读取事件完成。
2 - 如果您在两个队列中执行的内核之间存在依赖关系,那么您必须再次使用事件以正确的方式对内核进行排序。
所以你的问题取决于你在内核执行之间有什么样的依赖关系,以及你是否使用非阻塞调用来传输数据。如果您没有依赖项并且您正在使用阻塞调用进行数据传输,clFlush 将完成这项工作。否则,您需要活动。