顺序循环 - 2022.1 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文
如果设计中有多个循环,默认这些循环不会重叠,而是按顺序执行。本节介绍了顺序循环的数据流最优化概念。请考虑以下代码示例:
void adder(unsigned int *in, unsigned int *out, int inc, int size) {

  unsigned int in_internal[MAX_SIZE];
  unsigned int out_internal[MAX_SIZE];
  mem_rd: for (int i = 0 ; i < size ; i++){
    #pragma HLS PIPELINE
    // Reading from the input vector "in" and saving to internal variable
    in_internal[i] = in[i];
  }
  compute: for (int i=0; i<size; i++) {
  #pragma HLS PIPELINE
    out_internal[i] = in_internal[i] + inc;
  } 

  mem_wr: for(int i=0; i<size; i++) {
  #pragma HLS PIPELINE
    out[i] = out_internal[i];
  }
}

在上述示例中,显示了 3 个顺序循环:mem_rdcomputemem_wr

  • mem_rd 循环会从存储器接口读取输入矢量数据,并将其存储在内部存储空间中。
  • compute 循环会从内部存储空间读取,执行增量操作,并将结果保存到另一个内部存储空间中。
  • mem_wr 循环会将数据从内部存储空间写回存储器中。

此代码示例使用 2 个不同循环来读取和写入存储器输入/输出接口,以推断突发读取/写入。

默认情况下,这些循环按顺序执行,无任何重叠。首先,mem_rd 循环完成读取所有输入数据,然后,compute 循环开始其操作。同样,compute 循环完成处理数据后,mem_wr 循环再开始写入数据。但这些循环可重叠执行,即当有足够数据可供 compute(或 mem_wr)循环处理时,允许前一个循环在 mem_rd(或 compute)循环完成处理其数据之前尽快开始操作。

循环可使用数据流最优化来重叠执行,如 数据流最优化 中所述。