仅对英特尔可见 — GUID: ran1551293458343
Ixiasoft
产品终止通知
1. Intel® FPGA SDK for OpenCL™ Pro Edition最佳实践指南介绍
2. 查看您Kernel的report.html文件
3. OpenCL内核设计概念
4. OpenCL内核设计最佳实践
5. 分析(Profiling)您的内核来识别性能瓶颈
6. 提高单个Work-Item内核性能的策略
7. 提高NDRange内核数据处理效率的策略
8. 提高存储器访问效率的策略
9. 优化FPGA面积使用的策略
10. 优化英特尔 Stratix 10 OpenCL设计的策略
11. 提高主机应用程序性能的策略
12. Intel® FPGA SDK for OpenCL™ Pro版最佳实践指南存档
A. Intel® FPGA SDK for OpenCL™ Pro版最佳实践指南修订历史
仅对英特尔可见 — GUID: ran1551293458343
Ixiasoft
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. 事件执行顺序