仅对英特尔可见 — GUID: iti1511996061154
Ixiasoft
3.1.5. Pass-by-Value接口
对习惯于针对CPU编写代码的软件开发人员而言,按值传递数组中的每个元素可能并不直观,因为这样通常会导致许多函数调用或大型参数。然而,对于以FPGA为目标的代码,按值传递数组元素可使FPGA上的硬件更小,更简单。
可对向量加法实例编写代码以按值传递向量数组元素,如下所示。使用struct来按值传递整个数组(包含8个数据元素)。
struct int_v8 { int data[8]; }; component int_v8 vector_add( int_v8 a, int_v8 b) { int_v8 c; #pragma unroll 8 for (int i = 0; i < 8; ++i) { c.data[i] = a.data[i] + b.data[i]; } return c; }
该组件仅采用和处理向量a和向量b的8个元素,并返回向量c的8个元素。要计算实例的1024元素,则需要调用该组件128次(1024/8)。在此前的实例中,组件包含流水线化的循环,再此该组件被多次调用,且每次调用都被流水线化。
以下图示显示编译该实例时Graph Viewer中生成的Function View。.
图 5. 使用Pass-By-Value接口的vector_add组件的Graph Viewer Function View
该组件的延迟为1,且其具有的循环启动间隔(II)为1。
通过 Intel® Quartus® Prime编译流程编译 Intel® Arria® 10器件得到如下QoR指标:
使用pass-by-value接口的vector_add组件的QoR指标显示使用较少ALM, 更高组件fMAX,与延迟和II的优化值。该情况下,II与组件调用间隔相同。可每个时钟周期启动一次新的组件调用。启动间隔为1时,在128个周期中处理128次组件调用,因此总延迟为128。
QoR指标 | 指针 | Avalon® MM主接口 | Avalon® MM从接口 | Avalon® ST | Pass-by-Value |
---|---|---|---|---|---|
ALMs | 15593.5 | 643 | 490.5 | 314.5 | 130 |
DSPs | 0 | 0 | 0 | 0 | 0 |
RAMs | 30 | 0 | 48 | 0 | 0 |
fMAX (MHz)2 | 298.6 | 472.37 | 498.26 | 389.71 | 581.06 |
Latency (cycles) | 24071 | 142 | 139 | 134 | 128 |
Initiation Interval (II) (cycles) | ~508 | 1 | 1 | 1 | 1 |
1用于计算QoR指标的编译流程采用 Intel® Quartus® Prime Pro Edition 17.1。 |
2 fMAX的大小由计算单个seed得出。 |