Intel®高层次综合编译器专业版: 最佳实践指南

ID 683152
日期 12/04/2023
Public
文档目录

4.1.1. 指针接口

软件开发人员习惯针对CPU写代码,且首先尝试通过声明向量abc作为获得组件传入传出数据的指针来写码该算法。
这样使用指针将导致三个输入变量共享单个Avalon Memory-Mapped (MM) Host接口。

默认设置下组件中的指针作为 Avalon® Memory Mapped( Avalon® -MM)主接口实现。有关指针参数接口的更多详细信息,请参阅 Intel® High Level Synthesis Compiler Pro Edition参考手册中的 Intel HLS Compiler默认接口

使用指针接口的向量加法组件实例,写码如下:
component void vector_add(int* a,
                          int* b,
                          int* c,
                          int N) {
  #pragma unroll 8
  for (int i = 0; i < N; ++i) {
    c[i] = a[i] + b[i];
  }
}
下图显示编译该实例时Graph Viewer中生成的Function View。由于循环8倍展开,因此该图显示vector_add.B2有8个负载用于向量a,8个负载用于向量b,8个存储用于向量c。此外,因为所有负载和存储都在同一存储器上进行,会导致存储器访问率低下。
图 24. 使用Pointer接口的 vector_add组件的Graph Viewer Function View


如下Loop Analysis报告显示该组件的循环启动间隔(II)高于预期。II高是因为向量abc均通过同一Avalon-MM Host接口访问。而 Intel® HLS Compiler Pro Edition使用可停转仲裁逻辑来安排这些访问的时间,从而导致低性能和FPGA面积占用率高。

此外,编译器无法假设循环迭代之间不存在数据依赖关系,因为可能存在指针别名。编译器无法确定向量abc不重叠。如果存在数据依赖关系,则 Intel® HLS Compiler无法有效通过流水线运行循环迭代。



通过英特尔 Quartus Prime编译流程编译 Intel® Arria® 10器件组件得到如下QoR指标,包括高ALM使用率,高延迟,高II和低fMAX。所有这些都是不希望出现的组件属性。
表 2.  组件使用指针接口的QoR Metrics1
QoR Metric Value
ALMs 15593.5
DSPs 0
RAMs 30
fMAX (MHz)2 298.6
Latency(周期) 24071
Initiation Interval (II)(周期) ~508
1用于计算QoR指标的编译流程采用英特尔 Quartus Prime Pro Edition 17.1。
2 fMAX的大小由计算单个seed得出。