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

ID 683152
日期 6/22/2020
Public

本文档可提供新的版本。客户应 单击此处 前往查看最新版本。

文档目录

3.1.1. 指针接口

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

默认设置下组件中的指针作为 Avalon® Memory Mapped( Avalon® -MM)主接口实现。有关指针参数接口的更多详细信息,请参阅 Intel® High Level Synthesis Compiler专业版参考手册中的 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。此外,因为所有负载和存储都在同一存储器上进行,会导致存储器访问率低下。
图 1. 使用Pointer接口的 vector_add组件的Graph Viewer Function View


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

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



通过 Intel® 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指标的编译流程采用 Intel® Quartus® Prime Pro Edition 17.1。
2 fMAX的大小由计算单个seed得出。