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

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

1.2. 流水线

在流水线架构中,输入数据通过一系列阶段。每个阶段执行一个操作,并影响最终结果,例如存储器操作或计算。

微处理器,数字信号处理器(DSP),硬件加速器和数字硬件的其他高性能实现的设计通常包含流水线架构。

例如,下图中将以下示例代码片段(fragment)表示为多级(multistage)流水线:

for (i = 0; i < 1024; i++)
{
   y[i] = (a[i] + b[i] + c[i] + d[i] + e[i] + f[i] + g[i] + h[i]) >> 3;
}
图 2. 示例多级流水线结构图


使用流水线架构时,每个算术运算一次一个地进入流水线。因此,如上图所示,饱和流水线由8个阶段组成,这些阶段同时并行计算算法运算。此外,由于大量次数的循环迭代,流水线阶段持续并发执行每个后续循环迭代的运算指令。

Intel® FPGA SDK for OpenCL™ Pipeline Approach(流水线化方法)

基于您的设计构建一个新的流水线。以此适应FPGA的高度可配置性。

考虑以下OpenCL代码片段:

C = (A >> 5) + B;
F = (D – E) << 3;
G = C + F;

您可以配置FPGA以实例化一个复杂流水线结构,而该流水线结构同时执行全部代码。该情况下,SDK将代码实现为两个独立的流水线实体,并馈入一个流水线化加法器,入下图所示。

图 3.  SDK的Pipeline Approach实例


Intel® FPGA SDK for OpenCL™ Offline Compiler提供的定制流水线结构,通过允许大量work-item内的操作同时并发从而加速计算。离线编译器(offline compiler)可创建一个定制流水线,计算每时钟周期变量CFG的值,如下所示。在一个斜升阶段后,流水线维持每周期一个work-item的吞吐量。

图 4. FPGA流水线以及每时钟周期3个操作


传统处理器具有一组有限的共享寄存器。处理器终归必须将存储的数据写入存储器,才能使得更多数据占据寄存器。离线编译器(offline compiler)通过生成足够多的寄存器来保持数据的实时性("live"),以便存储流水线内所有有效work-item的数据。以下代码实例和图示说明OpenCL流水线中的实时(live)变量C

size_t index = get_global_id(0);

C = A[index] + B[index];
E[index] = C – D[index];
图 5. FPGA流水线以及实时变量C