先看看ARRAY_PARTITION的基本语法

描述

ARRAY_PARTITION是将数组按照指定要求分割成多个小的数组,形成多个小的存储空间。这带来的最直接的好处是增加了数据读/写端口的个数,也就提高了数据吞吐率,但同时也会消耗更多的RAM资源或者寄存器。

先看看ARRAY_PARTITION的基本语法,如下图所示。这种方法是直接在代码中用#pragma的方式描述,当然也可以直接在VitisHLS中采用图形界面方式描述,如下图所示。

在这里有两个个重要的参数type和factor,其中type有三个可选值,分别为block、cyclic和complete。我们看看三者到底有什么区别。为便于说明,这里我们以一个数组长度为12的一维数组A[12]为例。如果type为block,factor为4,意味着将A[12]分割为4个小的数组,这样每个数组的长度为12/4=3,同时每个数组中的元素是按顺序依次从原始数组中获取。如果type为cyclic,factor为4,这仍是将数组分割为4个长度为3的小数组,每个数组中的元素是交织地从原始数组中获取。如果type是complete,此时参数factor不起作用,可理解为将数组全部打散,可同时获取到12个元素,从而以寄存器方式实现。三者的区别如下图所示。

上述三种形式以#pragma的形式描述如下图所示。  

block、cyclic和complete在下面这种描述方式下,最终的结果是一致的。

这里有一个问题,如果factor不能被数组长度整除时会是怎样的结果呢?假定上述案例中factor为5,最终将是5个数组,其中前4个数组长度为2,最后一个数组长度为4。

ARRAY_PARTITION还允许对不同维度进行分割,以二维数组A[6][4]为例,dim的含义如下图所示。

一旦指定了dim,就可以对指定dim进行分割,这里以A[6][4]为例,分割情形如下图所示。

寄存器

此外,在使用#pragma方式描述时,可以通过宏macro给参数赋值,如下图所示方式。

  那么到底什么时候用block,什么时候用cyclic呢?本质上与数据流密切相关,在下一篇文章中我们给出一个具体案例帮助大家理解。

         责任编辑:lq

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分