c程序中有多个比较小的数组,可以映射为一个大的数组,而这个大的数组会消耗Block RAM或者UltraRAM,从而降低资源的用量。分为横向映射和纵向映射。
0 | 1 | 2 | ... | ... | M-1 |
---|
0 | 1 | ... | N-1 |
---|
在HLS中可以通过ARRAY_MAP中设置Horizontal,则合并后的数组长度为M+N:
0 | 1 | 2 | ... | ... | M-1 | 0 | 1 | ... | N-1 |
---|
0 | 1 | ... | ... | M-1 |
---|---|---|---|---|
0 | 1 | ... | N-1 |
在HLS中可以通过ARRAY_MAP中设置Vertical,最终数组的长度是最长的数组长度,宽度会发生变化。
这样可以在一定程度上减少资源而且可以获得一定的吞吐率ARRAY_PARTITION就是为了提高并行性,同时读取数据。同样的ARRAY_RESHAPE(对应的是同一个数组)也有三种方式:
0 | 1 | 2 | 3 | ... | ... | N-1 |
---|
重新组合之后:长度变为N/2,宽度变为原先的2倍
N/2 | N/2+1 | ... | N-1 |
---|---|---|---|
0 | 1 | ... | N/2-1 |
0 | 1 | 2 | 3 | ... | ... | N-1 |
---|
重新组合之后:长度变为N/2,宽度变为原先的2倍
1 | 3 | ... | N-1 |
---|---|---|---|
0 | 2 | ... | N-2 |
0 | 1 | 2 | 3 | ... | ... | N-1 |
---|
重新组合之后:长度变为1,宽度变为原先的N倍
0 |
---|
1 |
2 |
... |
N-1 |
例子:
#include"ap_int.h"
#define W 8
#define N 4
typedef ap_int<W> data_t;
void foo(data_t pa[N],data_t pb[N]);
#include"map.h"
void foo(data_t pa[N],data_t pb[N])
{
int i;
int k;
data_t A[N];
data_t B[N];
read_A:
for(i=0;i<N;i++)
{
A[i]=pa[i];
if(i%2==0)
{
A[i]=A[i]+5;
}
else
{
A[i]=A[i]-5;
}
}
read_B:
for(i=0;i<N;i++)
{
B[i]=pb[i];
if(i%2==0)
{
B[i]=B[i]+5;
}
else
{
B[i]=B[i]-5;
}
}
write_A:
for(i=0;i<N;i++)
{
pa[i]=A[i]*2;
}
write_B:
for(i=0;i<N;i++)
{
pb[i]=B[i]*2;
}
}
分别采用horizontal,vertical和RESHAPE