OpenCL最佳实践指南(https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf)在3.1.3节中建议使用clFlush确保命令以正确的顺序发生,例如数据传输之前不会进行处理:


传输数据到队列0
队列0的clFlush
为queue0运行内核,为queue1传输数据
clFlush用于队列0和队列1
为queue1运行内核,并为queue0检索数据
对他们俩都clFlush
检索queue1的数据


此处https://stackoverflow.com/a/12389713/4634819的答复建议使用事件来实现相同的效果。

我的问题是:我做对了吗?在这种情况下,clFlush和事件是否都达到相同的目的(避免同时执行)?使用哪个有关系吗?

最佳答案

clFlush仅确保入队函数使数据传输或内核执行入队,但不能确保调用的函数完成。在多种情况下,您需要使用事件:

1-如果您正在使用对数据传输的非阻塞调用,则需要使用事件来确保已完成所有传输,然后才能开始执行内核以及将其复制回主机时,您需要等待读取事件完成。

2-如果在两个队列中都在执行的内核之间具有依赖性,则再次必须使用事件以正确的方式对内核进行排序。

因此,您的问题取决于内核执行之间的依赖关系以及是否使用非阻塞调用来传输数据。如果没有依赖项,并且正在使用阻塞调用进行数据传输,则clFlush将完成此工作。否则,您需要事件。

关于opencl - 重叠的传输和执行:确保以正确的顺序执行命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46618812/

10-13 05:33