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

2024-06-02 13:36

本文主要是介绍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流水线的概念为硬件设计师提供了一种提高硬件性能和效率的方法。

这篇关于Vitis HLS 学习笔记--FRP自由运行流水线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024116

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

eclipse如何运行springboot项目

《eclipse如何运行springboot项目》:本文主要介绍eclipse如何运行springboot项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目js录当在eclipse启动spring boot项目时出现问题解决办法1.通过cmd命令行2.在ecl

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen