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

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

4.1.2. 通道和管道的执行顺序

内核程序种的每个通道或管道调用都被转换成能在FPGA流水线中执行的指令。 如果有效的工作项通过管道执行,则执行通道调用或者管道调用。 然而,即使通道或管道调用之间无控制或数据依赖关系,它们的执行也可能无法实现内核流水线中完美的指令集并行。

请参考如下代码实例:

表 15.  具有两个读取通道或管道调用的内核
具有两个读取通道的内核 具有两个读取管道的内核
__kernel void consumer (__global uint*restrict dst) { for (int i = 0; i < 5; i++) { dst[2*i] = read_channel_intel(c0); dst[2*i+2] = read_channel_intel(c1); } }
__kernel void consumer (__global uint*restrict dst, read_only pipe uint __attribute__((blocking)) c0, read_only pipe uint __attribute__((blocking)) c1) { for (int i = 0; i < 5; i++) { read_pipe (c0, &dst[2*i]); read_pipe (c1, &dst[2*i+2]); } }

左边的代码示例进行了两次读取通道调用。右边的代码示例进行了两次读取管道调用。大多数情况下,内核并行执行这些通道或管道调用;然而,通道和管道调用可能会乱序执行。乱序执行就意味着从c1的读取操作可以在从c0的读取操作之前发生并完成。