xilinx mmult

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进行了分区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值