HLS之pragma

本文主要涉及与HLS常用pragma的一些知识


前言

本文主要涉及与HLS相关的一些知识


提示:以下是本篇文章正文内容。

一、HLS重点Pragma

          HLS中Pragma主要涉及三个方面的应用,主要是硬件资源,数据流设计,接口设计。

1.硬件资源指定(RESOURCE)

    指定向FPGA硬件资源映射时的资源类型

    关键字:RESOURCE

    文法:

#pragma HLS RESOURCE variable=<temp> core=<Xilinx core>

    Examples:

int A[1024];
#pragma HLS RESOURCE variable=A core=RAM_T2P_BRAM

     如上例所示,例如我们申明了一个数组,而我们需要用一个双口的BRAM来存储数组里的数据,我们可以使用pragma,<temp>处填上变量名,<core>处填上对应的硬件资源类型。

注:数组可以存储为片上的存储单元/Buffer/Scratchpad Memory

       一般的硬件资源类型有两种:

      (1)Flip-flop(FF)

  • 单个时钟周期内可以并行访问多个地址;
  • 单个时钟周期内可完成度,写操作;
  • 容量有限,典型值大约在100Kbytes;                

      (2)Block RAM(BRAM)

  • 高容量:典型值在Mbytes级别
  • 访问性能受限:端口有限

2.数组划分(array_partition)

    指定一个线上资源的存储,如何在线上资源中进行排布

    关键字:array_partition

    文法:

#pragma HLS array_partition variable=<name><type> factor=<int> dim=<int>

 <name>:划分的数组名;

 <factor>:划分的份数;

 <type>:划分方式:其中包含:

  • block:按照factor平均分割;
  • cyclic:按取模的方式划分;
  • complete:将数组打散为N个元素分别存储

<dim>:多维数组中指定划分的维度;

3.循环边界(loop_tripcount )

    用于指定循环边界,在HLS综合过程中,循环迭代次数要求为定值,否则无法获得性能估计结果。此时我们可以利用loop_tripcount来指定循环迭代的最小值,最大值和平均值,用于比较准确的性能分析。

   关键字:loop_tripcount 

   文法:

#pragma HLS loop_tripcount min=<int> max=<int> avg=<int>

4.循环展开(UNROLL)

    用于循环并行优化,根据设定的factor,将循环体内的代码复制多份,指定不同的硬件资源来实现循环结构,复制多份代码并行处理同一任务,以硬件资源的消耗换取性能的提升

    关键字:UNROLL

    文法:

#pragma HLS UNROLL(factor=<int>)

5.循环流水化(PIPELINE/dataflow)

    1.PIPELINE

   将循环中的操作划分为多个流水级,从而使多个iteration并发执行

    关键字:PIPELINE

    文法:

#pragma HLS PIPELINE (II = <int>)

(默认II为1)

   2.dataflow

    任务级流水化,比PIPELINE颗粒更大,作用于不同的子函数

    关键字:dataflow

    文法:

#pragma HLS dataflow

6.函数内联(INLINE)

    控制函数在调用时是否内联

    关键字:INLINE

    文法:

#pragma HLS INLINE(off)

二、数值精度

支持任意精度,任意位宽的有/无符号数据类型

头文件:"ap_int.h","ap_fixed.h"

精度处理文法: 在cpp文件中添加头文件后,可定义(width为位宽):

  • Unsigned int :     ap_uint<width>
  • Signed int :    ap_int<width>
  • Unsigned fixed:    ap_ufixed<width , width_int>
  • Signed fixed:   ap_fixed<width , width_int>

在优化硬件算法时,可合理分配数据位宽,注意硬件资源,效率与运算精度的平衡。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HLS pipeline是一种在高级综合(High-Level Synthesis, HLS)中使用的技术,用于优化循环体中的数据依赖关系,以提高设计的性能。通过将循环体中的计算任务分解成多个阶段,并通过流水线并行化来减少计算任务之间的依赖关系,从而实现更高的吞吐量和更低的延迟。 在引用中提到了使用pipeline可以提高性能的结论。具体来说,引用指出,使用pipeline可以使性能比不使用pipeline的情况快约2*10的三次方倍,并且在整个循环体外加pipeline的效果比在循环体内加效果更好。 在引用中提到了一种使用HLS DEPENDENCE进行优化的方法。通过在代码中使用#pragma HLS DEPENDENCE指令,可以告诉编译器不同部分之间的数据依赖关系,从而帮助编译器进行更好的优化。具体地,引用的例子展示了如何使用#pragma HLS DEPENDENCE指令来解决output_buffer中的数据依赖关系,以便进行流水线并行化。 引用中提到了通过对比实验,在不同位置添加pipeline对性能的影响非常大。具体来说,引用通过对比在for循环中不同位置添加pipeline后进行C综合的结果,发现在第一种方式下的性能更好。 综上所述,HLS pipeline是一种用于优化循环体中数据依赖关系的技术,可以提高设计的性能。通过使用HLS DEPENDENCE指令来指定依赖关系,以及在适当的位置添加pipeline,可以进一步优化设计的性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vivado HLS在不同位置添加pipeline对延时的影响](https://blog.csdn.net/Deep_win/article/details/115905306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [HLS基础学习](https://blog.csdn.net/alangaixiaoxiao/article/details/103310707)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值