首页 > 其他分享 >HLS - 数组优化

HLS - 数组优化

时间:2023-06-14 21:55:29浏览次数:50  
标签:map tmp1 复杂度 HLS 数组 variable 优化


1. 空间复杂度

  • 程序的两个衡量指标:时间复杂度(时钟频率)和空间复杂度(资源)。
  • 时间复杂度体现在循环语句,空间复杂度体现在数组上。

2. Partition展开操作

  • 为什么Partition可以提升性能

    • HLS将数组映射到Memory中。如果数组是作为顶层函数的形参,那么就会被综合成memory的接口;如果数组在设计内部,会根据数组大小及优化方式被综合成移位寄存器(大小<1024)/BRAM,LUTRAM,UltraRAM。
    • 存在的问题
      • 当数组作为存储器来实现时,存储器端口的数量会限制对数据的访问,可能导致流水线失败。

      • 假设一数组用单端口RAM实现,功能:扫描数组,依次访问连续三个地址的数据求和;此时每个周期只能进行一次读/写,无法实现流水线。

        • 若想实现吞吐量为1,需要预读取数据,并手动对数据访问流水打拍。
           dout_t array_mem_perform(din_t mem[N]) { 
           
           din_t tmp0, tmp1, tmp2;
           dout_t sum=0;
           int i;
           
           tmp0 = mem[0];
           tmp1 = mem[1];
           SUM_LOOP:for (i = 2; i < N; i++) {
           tmp2 = mem[i];
           sum += tmp2 + tmp1 + tmp0;
           tmp0 = tmp1;
           tmp1 = tmp2;
           }
               
           return sum;
          }
        
      • 即使使用双端口的RAM,每个时钟周期可进行两次访问,

    • 可以不用更改设计,HLS可以使用优化指令:Array Partition、Array Reshape.
  • Array Partition 有3个type可选

    • block、cyclic和complete
      • factor为n,将原数组等分成n个小的数组,每个数组的长度 = 原长度/n。
      • 以一维数组为例,如下图
      #param HLS ARRAY_PARTITION variable=weight_group block factor = 4 dim = 1
      #param HLS ARRAY_PARTITION variable=weight_group cyclic factor = 4 dim = 1
      #param HLS ARRAY_PARTITION variable=weight_group complete dim = 1
      
  • 对多维数组采用Partition展开

3. 数组的映射和重组

  • ARRAY_MAP
    • 将多个较小的数组映射成一个数组,以减少内部资源用量。
    • Horizontal:直接将多个数组拼接在一起,数组的长度等于N+M,数组的宽度为N和M的最大数组宽度。
  • Vertical:对于数组的每一个元素进行拼接,数组的长度等于N/M中最大的长度。
  • 命令介绍:其中variable是被map的数组;instance是map后的数组;mode可选horizontal/vertical;offset仅horizontal可选,int为合并的数组相较于0的偏移量。
    • 注:命令相关例子和用法可以查看Xilinx官网,有较为全面的解释。
    #pragma HLS array_map variable=<name> instance=<instance> <mode> offset=<int>
    //example 将C和D合并成CD
    #pragma HLS array_map variable=C instance=CD vertical
    #pragma HLS array_map variable=D instance=CD vertical
    
  • ARRAY_RESHAPE
    • 两步:

标签:map,tmp1,复杂度,HLS,数组,variable,优化
From: https://www.cnblogs.com/qianbinbin/p/17480662.html

相关文章

  • 数组的扁平化
    请编写一个函数,它接收一个 多维数组 arr和它的深度n,并返回该数组的 扁平化 后的结果。多维数组 是一种包含整数或其他 多维数组 的递归数据结构。数组扁平化是对数组的一种操作,定义是将原数组部分或全部子数组删除,并替换为该子数组中的实际元素。只有当嵌套的数组深......
  • 优化算法——遗传算法
    与遗传算法的第一次接触遗传算法是我进入研究生阶段接触的第一个智能算法,从刚开始接触,到后来具体去研究,再到后来利用遗传算法完成了水利水电的程序设计比赛,整个过程中对遗传算法有了更深刻的理解,在此基础上,便去学习和研究了粒子群算法,人工蜂群算法等等的群体智能算法。想利用这个时......
  • 优化算法——模拟退火算法
    模拟退火算法原理爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示:其目标是要找到函数的最大值,若初始化时,初始点的位置在处,则会寻找到附近的局部最大值点处,由于点出是一个局部最大值点,故对于爬山法来讲,该算法无法跳出局部最大值点。若初始点选择在处,根据爬......
  • 优化算法——坐标上升法
    一、坐标上升法算法原理坐标上升法(CoordinateAscent)每次通过更新函数中的一维,通过多次的迭代以达到优化函数的目的。假设需要求解的优化问题的具体形式如下:其中,是向量的函数。更新过程为每次固定除以外的参数,求得满足条件的,直到算法收敛,具体的算法过程如下所示:(图片来自参考文......
  • 有效的山脉数组
    给定一个整数数组arr,如果它是有效的山脉数组就返回 true,否则返回false。让我们回顾一下,如果arr 满足下述条件,那么它是一个山脉数组:arr.length>=3在 0<i <arr.length-1 条件下,存在 i 使得:arr[0]<arr[1]<...arr[i-1]<arr[i]arr[i]>arr[i+1]>...>......
  • 每日一道leetcode:4. 寻找两个正序数组的中位数
    1.题目(困难)题目链接给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nums1=[1,2],nu......
  • 【数据结构与算法面试题】子数组的最大和
    题目来源“数据结构与算法面试题80道”。问题分析:在数组的每一个位置处保存当前的最大值,当前的最大值组成为:解决方案:intget_max_subarray(int*a,intlength,bool&is_array_ok){ if(NULL==a||length<=0){ is_array_ok=false; return0; } int*p_h_a=(int*......
  • 92 面向对象 商品(多个属性)放入3个数组中
    对象packagecom.fqs.goods;publicclassGoods{privateintid;privateStringname;privatedoubleprice;privateintgeShu;publicGoods(){}publicGoods(intid,Stringname,doubleprice,intgeShu){this.id=......
  • 单调队列优化DP
    单调队列优化DP单调栈和单调队列都是借助单调性,及时排除不可能的决策,保持候选集合的高度有效性和秩序性。单调队列尤其适合优化决策取值范围的上、下界均单调变化,每个决策在候选集合中插入或删除至多一侧的问题。利用单调队列,我们可以舍去许多无用的状态,来更快的找出最优解。持......
  • hadoop优化部分参数
    yarn-site.xml:表示该节点服务器上yarn可以使用的虚拟CPU个数,默认是8,推荐将值配置与物理核心个数相同yarn.nodemanager.resource.cpu-vcores:24设置该节点上yarn可使用的内存,默认为8G,如果节点内存资源不足8G,要减少这个值,yarn不会智能的去检测内存资源,一般这个设置yarn的可用内......