我正在研究我的论文项目,试图研究是否以及何时使用OpenCL管道对CPU也有用(我们已经知道它们在FPGA中被广泛使用)。
我正在努力实施……
用于英特尔FPGA的OpenCL 2.0管道与 标准的OpenCL 2.0用于CPU。
一个重要的区别是标准的OpenCL 2.0管道 不 意味着用于建立并发之间的通信 内核。管道是内存对象的子类,它们的状态是 仅在同步点处强制执行(请参阅s3.3.1内存一致性 OpenCL 1.2规范),其中同步点是a 命令队列障碍或等待事件(见s3.4.3 同步)。换句话说,根据OpenCL 规范,写入管道的数据仅在内核时可见 完成执行。
用于FPGA的英特尔OpenCL还具有其他功能(扩展) OpenCL 2.0管道可用于FPGA:具体而言,它保证了这一点 内核可以通过管道进行通信,并提供一些扩展 使这种沟通更简单,更有效(阻塞管道, 主管,管道深度)。不支持所有这些功能 用于CPU的Intel OpenCL运行时。
但是,为了您的论文项目,您可以查看 英特尔FPGA SDK的快速仿真器:基本上它是一个CPU运行时 支持FPGA扩展,包括管道(内核到内核通信)和主机管道。看到 https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/opencl-sdk/aocl_programming_guide.pdf s8.7。使用快速模拟器(预览)。
此外,除非我使用两个不同的命令队列,否则内核似乎不会并行运行。
如果不使用创建命令队列 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ,队列是有序的,意思是 推送到此的命令之间存在隐式依赖关系 队列,所以他们不能并行运行。
CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
另外,你应该打电话 clFlush(command_queue) 之前 clEnqueueReadBuffer(command_queue2, ...) 确保作者 在为读者进行阻止调用之前启动内核。
clFlush(command_queue)
clEnqueueReadBuffer(command_queue2, ...)