【LabVIEW FPGA入门】流水线

news2024/10/7 14:26:17

LabVIEW中流水线

        在当今多核处理器和多线程应用程序的世界中,程序员在开发应用程序时需要不断思考如何最好地利用尖端 CPU 的强大功能。尽管用传统的基于文本的语言构建并行代码可能难以编程和可视化,但 NI LabVIEW 等图形开发环境越来越多地允许工程师和科学家缩短开发时间并快速实现他们的想法。

        由于 NI LabVIEW 本质上是并行的(基于数据流),因此多线程应用程序编程通常是一项非常简单的任务。框图上的独立任务自动并行执行,无需程序员进行额外的工作。但是那些不独立的代码片段又如何呢?在实现固有串行应用程序时,可以采取哪些措施来利用多核 CPU 的强大功能?

简介

        一种被广泛接受的用于提高串行软件任务性能的技术是流水线。简而言之,流水线是将串行任务划分为可以以流水线方式执行的具体阶段的过程。

        考虑以下示例:假设您正在自动化装配线上制造汽车。您的最终任务是建造一辆完整的汽车,但您可以将其分为三个具体阶段:建造框架、将零件放入其中(例如发动机)以及完成后对汽车进行喷漆。

        假设搭建框架、安装零件和喷漆各需要一小时。因此,如果一次只制造一辆车,每辆车将需要三个小时才能完成(参见下图 )。

        如何改进这个过程?如果我们设置一个用于框架构建的工作站,另一个用于零件安装的工作站,第三个用于喷漆的工作站,会怎么样?现在,当一辆车正在喷漆时,第二辆车可以安装零件,第三辆车可以进行框架施工。

 提高性能   

        尽管使用我们的新工艺,每辆汽车仍需要三个小时才能完成,但我们现在可以每小时生产一辆汽车,而不是每三个小时生产一辆——汽车制造工艺的吞吐量提高了 3 倍。请注意,此示例已出于演示目的进行了简化;有关管道的更多详细信息,请参阅下面的“重要问题”部分。

 LabVIEW中的基本流水线

        汽车示例中所展示的相同流水线概念可以应用于任何执行串行任务的 LabVIEW 应用程序。本质上,您可以使用 LabVIEW 移位寄存器和反馈节点将任何给定的程序制成“装配线”。以下概念图显示了示例管道应用程序如何在多个 CPU 内核上运行:

重要问题

        当使用流水线创建现实世界的多核应用程序时,程序员必须考虑几个重要的问题。具体来说,平衡流水线阶段和最小化内核之间的内存传输对于通过流水线实现性能提升至关重要。

平衡阶段

        在上面的汽车制造和 LabVIEW 示例中,假设每个管道阶段执行的时间相同;我们可以说这些示例管道阶段是平衡的。然而,在实际应用中,这种情况很少发生。考虑下图;如果阶段 1 的执行时间是阶段 2 的三倍,那么管道化这两个阶段只会产生最小的性能提升。

非流水线(总时间 = 4 秒):

 

流水线(总时间 = 3s):

注意:性能提升 = 1.33X(不是流水线的理想情况)

        为了纠正这种情况,程序员必须将任务从阶段 1 移至阶段 2,直到两个阶段的执行时间大致相等。对于大量的流水线阶段,这可能是一项艰巨的任务。

        在 LabVIEW 中,对每个流水线阶段进行基准测试有助于确保流水线良好平衡。使用平面序列结构结合 Tick Count (ms) 函数可以最轻松地完成此操作,如图  所示。

内核之间的数据传输

        最好尽可能避免在管道阶段之间传输大量数据。由于给定管道的各个阶段可以在单独的处理器内核上运行,因此各个阶段之间的任何数据传输实际上都可能导致物理处理器内核之间的内存传输。在两个处理器核心不共享高速缓存(或内存传输大小超过高速缓存大小)的情况下,最终应用程序用户可能会发现流水线效率下降。

FPGA中的流水线        

        流水线是一种可用于增强FPGA VI时钟速率和吞吐量的技术。在流水线设计中,用户可利用FPGA的并行处理特性提高顺序代码的有效性。如要实现流水线,必须将代码拆分为不同的级并连线每级的输入和输出端至循环中的反馈节点或移位寄存器。

        下图说明了如何将由 A 和 B 代码段组成的流程进行流水线化以减少每次循环迭代的长度。使用移位寄存器可以轻松实现将数据从一个循环迭代传递到下一个循环迭代(从 A 到 B)。

        可以利用流水线的一类应用程序是通过初步数据处理进行数据采集。在以下示例中,对数字输入线进行采样,测量数字信号中所有脉冲的宽度并将其写入 FIFO,以便在单独的循环中进行处理。在这两种实现中,移位寄存器用于存储数字线的状态和最后一个信号边沿的时间戳,以支持变化检测和连续信号边沿之间的时间计算。
 

         在顶部实现中(无流水线),循环继续计算脉冲宽度(减法),并在检测到边沿时将值写入 FIFO。

        在底层实现(使用流水线)中,当检测到信号边沿时,会将布尔标志写入附加移位寄存器,以便在下一个循环迭代中计算脉冲宽度并将其写入 FIFO。同时,从数字输入中获取下一个样本并与前一个样本进行比较。这使得底部循环能够检测边缘并并行处理它们并以更高的循环速率运行,从而使其能够检测更短的脉冲并在脉冲宽度测量中具有更好的定时分辨率。

        下文介绍了FPGA VI在单周期定时循环内的标准执行和流水线执行。

单周期定时循环中的标准执行

        在下列程序框图中,子VI A、B和C在单周期定时循环内顺序执行。因此,单周期定时循环的时钟速率必须设置为满足上述三个个运行子VI的运行时间的和值。

1378

单周期定时循环中的流水线执行,使用反馈节点

        在下列程序框图中,由于子VI的输入和输出连线至反馈节点,LabVIEW流水线处理子VI。在该FPGA VI中,子VI在单周期内并行执行,且最大时钟速率仅受具有最长组合路径的子VI的限制。

1378

单周期定时循环中的流水线执行,使用移位寄存器

        移位寄存器也可用于实现流水线代码,如下列程序框图所示。

1378

实现流水线代码

        实现流水线代码时考虑下列操作:

  • 最后一级的输出滞后输入的值等于流水线的级数。
  • 流水线填满前,时钟周期的输出无效。
  • 流水线的级数称为流水线深度。
  • 流水线延迟(以时钟周期为单位)对应其深度。流水线深度为N时,第N个时钟周期前的输出无效,且每个有效时钟周期的输出比输入端延迟N-1个时钟周期。

        请参考以下范例。

1378

        在该范例中,三个独立的执行步骤分别执行子VI A、B和C,即流水线深度为3。由于该代码需要三个执行步骤,输出要到时钟周期3才有效。每个有效时钟周期C的输出总是对应时钟周期C – (N – 1)的输入。

时钟周期说明
时钟周期 1在时钟周期1中,子VI A处理第一个测量值(Meas1),而子VI B和子VI C都处理移位寄存器的默认值(Default),产生无效输出。
时钟周期 2在时钟周期2中,子VI A处理第二个测量值(Meas2),子VI B处理时钟周期1中子VI A的输出,子VI C处理来自子VI B的无效输入,从而产生无效输出。
时钟周期 3在时钟周期3期间,由于所有输入都有效,并且子VI C的输出首次有效,流水线最终填满。子VI A处理第三次测量(Meas3),子VI B处理时钟周期2中子VI A的输出,而子VI C处理时钟周期2中子VI B的输出,从而产生与第一次测量(Meas1)相对应的输出。流水线填满后,全部后续时钟周期均生成有效的输出,常量延迟为两个时钟周期。

        提示考虑使用条件结构避免无效输出导致的未预期的操作,并确保控制算法在N个时钟周期后启用执行器。

使用流水线增加吞吐量

        使用流水线可增加吞吐量,因为流水线可在单周期定时循环内以更快的时钟域内运行。

1378

非流水线 (40 MHz)

        示意图顶部为非流水线循环的执行时间。该代码包含三个子VI,每个需要12.5 ns的传播延迟。子VI A至子VI C的全部延迟为37.5 ns,相对于40 MHz编译频率,延迟时间过长。

流水线 (40 MHz)

        示意图的中部给出了流水线处理代码将传播延时减少至12.5 ns,从而循环可在40 MHz进行编译。

流水线 (80 MHz)

        示意图底部为使用高达80 MHz时钟速率编译的循环,因为流水线循环的传播延迟仅为12.5 ns。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小狐狸ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境包括Linux系统的CentOS 7.6,宝塔面板,PHP 7.4和MySQL 5.6。网站的根目录是public, 使用thinkPHP进行伪静态处理,并已开启SSL证书。 该系统具有多种功能,包括文章改写、广告营销文案创作、编程助手、办公达人…

健身·健康行业Web3新尝试:MATCHI

随着区块链技术进入主流,web3 运动已经开始彻底改变互联网,改写从游戏到金融再到艺术的行业规则。现在,MATCHI的使命是颠覆健身行业。 MATCHI是全球首个基于Web3的在线舞蹈健身游戏和全球首个Web3舞蹈游戏的发起者,注册于新加坡&a…

6_20240304开窗

目录 课堂 SQL执行顺序: 开窗函数 累加order by 开窗格式: 排名 三种排名: 偏移 上偏移 下偏移 同环比 加子查询的几种方式 1 放在 select 后面 2 放在 from 后面 当表 ​3 放在where 后 4 放在HAVING 后面 作业 1.Ord…

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状,可自由动态更改画线的粗细、拐角圆滑度、颜色,自由增减节点,不额外增加gameobject,并且在原生的UGUI上以ScreenSpace-Overlay的状态下,显示效果如下所示 …

rust引用本地crate

我们可以动态引用crate,build时从crate.io下载,但可能因无法下载导致build失败。首次正常引用三方crate,build时自动下载的crate源码,我们将其拷贝到固定目录中; build后可在RustRover中按住Ctrl键,在crat…

Python的网络爬虫介绍与实战

Python的网络爬虫基础介绍与实战 定义流程包和函数静动态网页爬虫实战红牛分公司?二手房数据(静态网页)豆瓣读书(动态网页) 定义 网络爬虫是按照一定的规则,自动地抓取万维网(www)信…

【Kubernetes】k8s删除master节点后重新加入集群

目录 前言一、思路二、实战1.安装etcdctl指令2.重置旧节点的k8s3.旧节点的的 etcd 从 etcd 集群删除4.在 master03 上,创建存放证书目录5.把其他控制节点的证书拷贝到 master01 上6.把 master03 加入到集群7.验证 master03 是否加入到 k8s 集群,检查业务…

用尾插的思想实现移除链表中的元素

目录 一、介绍尾插 1.链表为空 2.链表不为空 二、题目介绍 三、思路 四、代码 五、代码解析 1. 2. 3. 4. 5. 6. 六、注意点 1. 2. 一、介绍尾插 整体思路为 1.链表为空 void SLPushBack(SLTNode** pphead, SLTDataType x) {SLTNode* newnode BuyLTNode(x); …

[大模型]ollama本地部署自然语言大模型

文章目录 ollama下载地址githup百度云 模型默认安装位置模型修改默认安装位置可下载模型相关命令 Chatbox客户端下载地址githup百度云 设置ollama模型并运行 大模型已经发布很久,网络上的大模型形形色色,现在已然是群英荟萃,那么,…

2.vscode 配置python开发环境

vscode用着习惯了,也不想再装别的ide 1.安装vscode 这一步默认已完成 2.安装插件 搜索插件安装 3.选择调试器 Ctrl Shift P(或F1),在打开的输入框中输入 Python: Select Interpreter 搜索,选择 Python 解析器 选择自己安…

AI基础知识(2)--决策树,神经网络

1.什么是决策树? 决策树是一类常见的机器学习方法,决策树是基于树的结构来进行决策。决策过程中提出的每一个问题都是对于属性的“测试”,决策的最终结论对应了我们希望的判定结果。一个决策树包含一个根节点,若干个内部节点和若…

实时云渲染及云交互技术的关系

一、实时云渲染和云交互技术 实时云渲染是一种新兴的技术,它可以将用户的计算机上的数据通过云服务器进行渲染,从而实现实时渲染的效果,实时渲染可以在加速渲染速度的同时,实现更高质量的渲染效果、减轻用户的计算机负担、全方位…

【go语言开发】性能分析工具pprof使用

本文主要介绍如何在项目中使用pprof工具。首先简要介绍pprof工具的作用;然后介绍pprof的应用场景,主要分为工具型应用和服务型应用。最后数据分析项目,先采集项目信息,再可视化查看 文章目录 前言应用场景工具型应用服务型应用 数…

22 OpenCV 直方图计算

文章目录 直方图概念split 通道分离函数calcHist 计算直方图normalize 归一化函数示例 直方图概念 上述直方图概念是基于图像像素值,其实对图像梯度、每个像素的角度、等一切图像的属性值,我们都可以建立直方图。这个才是直方图的概念真正意义&#xff0…

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第六:trans_nullmodel class

近几十年来,系统发育分析和零模型的整合通过增加系统发育维度,更有力地促进了生态位和中性影响对群落聚集的推断。trans_nullmodel类提供了一个封装,包括系统发育信号、beta平均成对系统发育距离(betaMPD)、beta平均最近分类单元距离(betaMNT…

时间序列预测的零样本学习是未来还是炒作:TimeGPT和TiDE的综合比较

最近时间序列预测预测领域的最新进展受到了各个领域(包括文本、图像和语音)成功开发基础模型的影响,例如文本(如ChatGPT)、文本到图像(如Midjourney)和文本到语音(如Eleven Labs&…

【GPT-SOVITS-06】特征工程-HuBert原理

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

从0开始写一个问卷调查APP的第11天

1.今日任务 分析:上次我们实现了从数据库中成功的查找到对应问卷的问题并在前端展示出来,那么今天我们增加难度。在数据库中插入多项选择问题,在接口中查找到并在前端显示出来。 2.实现 2.1数据库中插入测试数据 我们先查看一下表的结构 2.2接口实现…

软件架构设计 C/S与B/S架构的区别

一、什么是C/S架构? C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle或SQLServer。 C/S架构软件有一个特点,就是如果用户要使用的话,需要下载一个客户端&#x…

nodejs部署

字符集转换: mysql报错:Incorrect string value: \xF0\x9F... for column XXX at row 1_incorrect string value: \\xf0\\x9f\\x94\\xa5\\xe8-CSDN博客 查看nginx是否启动 ps -ef|grep nginx 检查nginx是否配置正确 nginx -t 防火墙开启端口 启动并…