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

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

7.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 实现为两个片上存储块,每个块都有自己的加载和存储指令。

图 36. 实现组件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;
}
图 37. 从深度方向合并组件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存储系统为所有访问提供足够端口。否则,访问必须共享端口,从而阻止无停机访问。

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