mmult_pipeline
管道pragma通过允许循环的多个迭代并行运行,减少了启动间隔,即连续循环迭代的开始时间之间的时钟周期数。
void mmult_pipeline(int in1[DATA_SIZE * DATA_SIZE], int in2[DATA_SIZE * DATA_SIZE], int out[DATA_SIZE * DATA_SIZE], int dim)
{
//loop tripcount constant
const int c_size = DATA_SIZE;
//Reads the data from DDR, performs the computation
//and writes back the result to DDR.
loop1: for (int i = 0 ; i < dim ; i++){
#pragma HLS loop_tripcount min=c_size max=c_size
loop2: for(int j = 0; j < dim; j++){
#pragma HLS loop_tripcount min=c_size max=c_size
int result = 0;
loop3: for(int k = 0; k < dim; k++){
#pragma HLS loop_tripcount min=c_size max=c_size
#pragma HLS PIPELINE
//The PIPELINE pragma reduces the initiation interval, which is the
//number of clock cycles between the start times of consecutive loop
//iterations by allowing multiple iterations of a loop to run in parallel.
result += in1[i * dim + k] * in2[k * dim + j];
}
out[i*dim +j] = result;
}
}
}
只需要加一行代码 #pragma HLS PIPELINE
#pragma HLS loop_tripcount min=c_size max=c_size无关乎合成结果,
如果循环延迟未知或无法计算,则 TRIPCOUNT
编译指示允许您指定循环的最小和最大迭代。这使该工具可以分析循环延迟如何影响报告中的总设计延迟,并帮助您确定设计的适当优化。
mmlut_zerocopy
zero_copy pragma指定了sds c++编译器来生成可编程逻辑设计,允许硬件函数直接从DDR内存中访问数据。
mmlut_partition
物理实现的内存只有有限的读/写量端口,这可以通过使用ARRAY_PARTITION pragma来克服
当loop_3自动展开时,local_in1[i][k]中的列“k”是变量,而在local_in2[k][j]中,行“k”是变量。因此,为了实现有效的流水线处理,在维2中对local_in1进行了分区,在维1中对local_in2进行了分区。