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

ID 683152
日期 6/22/2020
Public

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

文档目录

6.3.1. 实例:从深度方向合并存储器

使用hls_merge("<mem_name>","depth") 属性强制 Intel® HLS Compiler Pro Edition在同一存储系统中实现变量,从深度合并存储器。

hls_merge属性都设置了<mem_name>标签的所有变量进行合并。

考虑如下组件代码:

component int depth_manual(bool use_a, int raddr, int waddr, int wdata) { int
              a[128]; int b[128]; int rdata; // mutually exclusive write if (use_a) { a[waddr] =
              wdata; } else { b[waddr] = wdata; } // mutually exclusive read if (use_a) { rdata =
              a[raddr]; } else { rdata = b[raddr]; } return rdata; }

代码指示 Intel® HLS Compiler Pro Edition将局部存储器ab 实现为两个片上存储块,每个块都有自己的加载和存储指令。

图 13. 实现组件depth_manual的局部存储器

由于本地存储器ab的加载和存储指令互斥,因而可以合并访问,如以下实例代码所示。合并存储器访问可将加载和存储指令的数量,和片上存储器块的数量减少一半。

component int depth_manual(bool use_a, int raddr, int waddr, int wdata) { int
              a[128] hls_merge("mem","depth"); int b[128] hls_merge("mem","depth"); int rdata; // mutually exclusive
              write if (use_a) { a[waddr] = wdata; } else { b[waddr] = wdata; } // mutually
              exclusive read if (use_a) { rdata = a[raddr]; } else { rdata = b[raddr]; } return
              rdata; }
图 14. 从深度方向合并组件depth_manual的局部存储器

某些情况下,就深度合并局部存储器可能会降低存储器访问效率。在决定是否就深度合并局部存储器之前,请参阅HLD报告( <result>.prj/reports/report.html)确保生成具有预期数量加载和存储指令的预期存储配置。以下实例中, Intel® HLS Compiler Pro Edition不应将访问合并为局部存储器ab,因为每个存储器的加载和存储指令并不互斥。

component int depth_manual(bool use_a, int raddr, int waddr, int wdata) { int
              a[128] hls_merge("mem","depth"); int b[128] hls_merge("mem","depth"); int rdata; // NOT mutually exclusive write  a[waddr] = wdata;
              b[waddr] = wdata; // NOT mutually
                exclusive read  rdata = a[raddr]; rdata += b[raddr]; return rdata; }

该情况下, Intel® HLS Compiler Pro Edition可能会double pump存储系统为所有访问提供足够端口。否则,访问必须共享端口,从而阻止无停机访问。

图 15. 用于组件depth_manual的非互斥访问的局部存储器