Intel® FPGA SDK for OpenCL™ Pro Edition: 最佳实践实践指南

ID 683521
日期 9/26/2022
Public
文档目录

11.2.1. 双缓冲主机应用程序利用内核调用队列

OpenCL主机应用程序中的双缓冲使得OpenCL运行时环境将存储器传输和内核执行合并。

要在双缓冲时使用硬件内核调用队列,请按如下所示的代码片段编写您的主机代码:

int main() {cl_event dependencies[2]; for (int i=0; i<MAX_ITERATIONS; i++) { if (i < 2) { clEnqueueWriteBuffer(writeQ, inputBufferD[i%2], CL_FALSE,, inputBufferH[i], 0, NULL, &writeEvent[i]); clFlush(writeQ); clSetKernelArg(kernel, 0, sizeof(cl_mem *), &inputBufferD[i%2]); clSetKernelArg(kernel, 1, sizeof(cl_mem *), &outputBufferD[i%2]); clEnqueueNDRangeKernel(kernelQ, kernel,, 1, &writeEvent[i], &kernelEvent[i]); clFlush(kernelQ); } else { clEnqueueWriteBuffer(writeQ, inputBufferD[i%2], CL_FALSE,, inputBufferH[i], 1, &kernelEvent[i-2], &writeEvent[i]); clFlush(writeQ); dependencies[0] = writeEvent[i]; dependencies[1] = readEvent[i-2]; clSetKernelArg(kernel, 0, sizeof(cl_mem *), &inputBufferD[i%2]); clSetKernelArg(kernel, 1, sizeof(cl_mem *), &outputBufferD[i%2]); clEnqueueNDRangeKernel(kernelQ, kernel,, 2, dependencies, &kernelEvent[i]); clFlush(kernelQ); } clEnqueueReadBuffer(readQ, output_device[i%2], CL_FALSE,, outputBufferH[i], 1, &kernelEvent[i], &readEvent[i]); clFlush(readQ); }}

下图有助于您查看事件依赖项:

注: 箭头表示事件等待列表中的事件源。
图 93. 事件依赖项图

下图说明命令在器件上执行的顺序,假设内核执行时间长于读取和写入,并且器件支持并发读取和写入。

图 94. 事件执行顺序