您的位置:首页 > 教育 > 锐评 > Vitis HLS 学习笔记--FRP自由运行流水线

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

2024/10/6 0:27:04 来源:https://blog.csdn.net/DongDong314/article/details/139381561  浏览:    关键词:Vitis HLS 学习笔记--FRP自由运行流水线

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 offdouble 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 offfor (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_indouble regA[8];
#pragma HLS ARRAY_PARTITION variable = regA completefor (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 = strmdouble 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流水线的概念为硬件设计师提供了一种提高硬件性能和效率的方法。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com