Vitis HLS 学习笔记--FRP自由运行流水线

发布于:2024-06-02 ⋅ 阅读:(129) ⋅ 点赞:(0)

1. 简介

在Vitis HLS中,FRP自由运行流水线(Free Running Pipeline)是一种流水线风格的架构,它即使在没有输入数据的情况下也会运行。这种架构优化了频率,因为它减少了寄存器使能信号的扇出,简化了流水线控制逻辑。FRP流水线通常用于需要避免因为停滞而导致的性能下降或死锁的场合。

FRP流水线与传统的可刷新流水线(flushable pipeline)相比,有以下优点:

  • 没有使用限制:不会因为缺少输入数据而停滞。
  • 资源使用最少:通常情况下,FRP流水线会使用较少的资源,但这并不是绝对的。
  • 更好的时序:由于减少了流水线控制信号的扇出,可以获得更好的时序性能。

FRP流水线也有一些限制和缺点,例如:

  • 不可刷新:如果下一次迭代的输入数据缺失,已经计算出的输出可能无法被传递。
  • 可能导致数据流中的死锁:在数据流架构中,如果流水线停滞,可能会导致死锁。
  • 对于MAXI接口不支持:FRP流水线不支持MAXI接口,这可能限制了其在某些应用场景中的使用。

要实现FRP流水线,可以使用#HLS pragma pipeline style=frp指令来指定特定流水线的风格,或者使用config_compile -pipeline_style frp全局配置。

2. 代码分析

#include "ap_axi_sdata.h"
#include "hls_stream.h"

int accumulate(double A[]) {
#pragma HLS inline off

    double acc = 0.0;
    for (int i = 0; i < 8; i++) {
        std::cout << "A: " << A[i] << std::endl;
        acc += A[i];
    }
    return acc;
}

void process(hls::stream<double>& strm_in, hls::stream<double>& strm_out) {
#pragma HLS inline off

    for (int i = 0; i < 8; i++) {
        double tmp;
        tmp = strm_in.read();
        strm_out.write(tmp);
    }
}

void inner(double A[8], hls::stream<double>& stream_in, double* out) {
#pragma HLS pipeline

#pragma HLS INTERFACE ap_fifo port = stream_in
    double regA[8];
#pragma HLS ARRAY_PARTITION variable = regA complete
    for (int i = 0; i < 8; i++) {
        double tmp;
        tmp = stream_in.read();
        regA[i] = A[i] + tmp;
    }

    *out = accumulate(regA);
}

void free_pipe_mult(double A[8], hls::stream<double>& strm, double* out) {
#pragma HLS DATAFLOW
#pragma HLS INTERFACE ap_fifo port = strm

    double B[8];

    for (int i = 0; i < 8; i++)
        B[i] = A[i] + i;

    hls::stream<double> strm_out;
    process(strm, strm_out);
    inner(B, strm_out, out);
}

 代码功能解释:

  • accumulate 函数功能:计算一个双精度浮点数数组的累加和。 
  • process 函数功能:从输入流中读取数据,并将其写入输出流。
  • inner 函数功能:从输入流中读取数据,与数组 A 中的数据相加,然后调用 accumulate 函数计算结果。
  • free_pipe_mult 函数功能:实现数据流模型,将数组 A 的每个元素与其索引相加,然后通过流处理和 inner 函数计算最终结果。

 需要配置编译指令:

# Set any optimization directives
config_dataflow -default_channel fifo -fifo_depth 16
config_compile -pipeline_style frp
set_directive_interface -mode ap_fifo "free_pipe_mult" B
set_directive_interface -mode ap_fifo "free_pipe_mult" out
# End of directives

 

3. 总结

FRP自由运行流水线是一种高效的硬件架构风格,它通过持续运行来优化性能,即使在没有新的输入数据时也不会停滞。这种设计简化了控制逻辑,减少了资源使用,并提高了时序性能。然而,FRP流水线也有其局限性,如不支持MAXI接口,且在某些情况下可能导致死锁。

代码示例展示了如何在Vitis HLS中使用FRP流水线和数据流指令来优化硬件设计。accumulate 函数计算数组的累加和,process 函数处理数据流,inner 函数结合输入流和数组数据进行计算,而 free_pipe_mult 函数则整合了这些操作,展示了一个完整的数据流模型。这些函数通过HLS指令进行了优化,以实现并行执行和性能提升。这段代码和FRP流水线的概念为硬件设计师提供了一种提高硬件性能和效率的方法。


网站公告

今日签到

点亮在社区的每一天
去签到