ARRAY_RESHAPE数组重组指令结合了ARRAY PARTITION和ARRAY MAP的垂直模式。-使用数据重组减少块RAM的数量,仍然允许分区的有益属性:并行访问数据。 示例: 对上述例子分别使用水平映射、垂直映射、还有重组的方式。 从上图结果中可以看出,对于使用MAP指令,减少了RAM的使用量,但是不能提升数据的吞吐量。而使用RESHAPE指令,通...
array_reshape指令与array_partition指令的功能类似,能够重构阵列,并提供对数据的并行访问。对于一维数组,给定如下代码: voidfoo(...){intarray1[N];intarray2[N];intarray3[N];#pragma HLS array_reshape variable=array1 type=block factor=2 dim=1#pragma HLS array_reshape variable=array2 type=cycle fact...
可以不用更改设计,HLS可以使用优化指令:Array Partition、Array Reshape. Array Partition 将原先一个大的memory拆分成多个小的memory/registers,增加了存储器的读写端口。提高了设计的吞吐量,但是需要更多的内存/寄存器资源。 有3个type可选:block、cyclic和complete ...
2.纵向映射(ARRAY_MAP):相应位置的元素做位拼接 在HLS中可以通过ARRAY_MAP中设置Vertical,最终数组的长度是最长的数组长度,宽度会发生变化。 3.ARRAY_RESHAPE:直接组合ARRAY_PARTITION和纵向的ARRAY_MAP结合在一起 这样可以在一定程度上减少资源而且可以获得一定的吞吐率ARRAY_PARTITION就是为了提高并行性,同时读取数据。
数组重组通过ARRAY_RESHAPE设置,其只针对同一个数组进行操作。也有block、cyclic和complete三种方式。 经过block和cyclic方式重组后,数组元素变为一半,位宽变为原来的两倍。经过complete方式重组,元素个数为1,位宽为原来的N倍。 ROM的定义 有时需要定义ROM,在HLS中,最简单的方式就是:const+初始值。当然,也可以采用头...
当使用 DATA_PACK、ARRAY_PARTITION 或 ARRAY_RESHAPE 等编译指示让更多数据在单个时钟周期内访问时,Vivado HLS 会自动展开任何消耗此数据的循环,如果这样做可以提高吞吐量。 该循环可以完全或部分展开,以创建足够的硬件以在单个时钟周期内消耗额外的数据。 此功能是使用 config_unroll 命令控制的。
④Array Partion/Reshape 当需要向某个SRAM存取数据时,若存取速度较慢,该SRAM可能成为整个系统的设计瓶颈,因为所有其他的部分都在等待存取的完成。采用该策略可能会消耗更多的SRAM资源以供并行存取(或提供多个存取接口)。 Partion:1个阵列切成小块->多个存取接口。
首先使用hls::vector类型和使用array_reshape都是可以进行向量化的。(说个无关的:混合使用向量化和array...
为了保证逻辑,需要在中间加入if判断逻辑,这会使得整个电路的控制逻辑变得复杂。但假如我们已经知道指定的...
因此接下来,我们对数组进行reshape变形处理: 由于乘积循环的循环索引为k,因此两个数组都应沿其各自的k维进行分区:设计需要在每个时钟周期访问两个以上的k值。对于数组a,这是dim=2,因为其访问模式为a[i][k]; 对于数组b,dim=1,因为其访问模式为b[k][j]。