也谈PCIe带宽问题

news2024/11/13 9:43:00

每每谈到PCIe速率的时候,必不可少要谈论的就是PCIe的带宽问题。互联网上也有很多帖子在谈这个事情,但总觉得差那么点意思。我从几个维度来讨论我的理解,希望有些信息能带给大家不一样的看法。先贴张PCIe速率提升图。

图片

理论带宽、实际带宽、带宽利用率、单向带宽、双向带宽

PCIe理论带宽的计算是:链路速率 x Lane number, 如果计算双向带宽的话还要再乘以2(PCIe是双工通信),比如PCIe 3.0 x16的理论带宽为:8Gbps x 16 = 16GB/s 。那这里有个要讨论的问题就是什么时候带宽乘2,什么时候不乘2呢?我们介绍完实际带宽之后再来讨论这个问题。

在讨论实际带宽的时候其实更多的时候也是一个工程问题,这个时候我们更多从带宽本身的概念出发去衡量:带宽定义为单位时间传输的数据量。工程上做带宽评估就是记录发起数据请求的时间,再记录一下响应返回的时间,然后用:请求的数据量/时间来计算实际带宽。

带宽利用率 = 实际带宽 / 理论带宽。这里边理论带宽一般是定值,所以实际带宽越高意味着带宽利用率越高,也就意味着传输性能越高。项目上做带宽优化就是分析系统中影响性能的因素,然后调节这些因素来提高带宽利用率。

现在我们来回答上面的是否乘2问题。工程上在分析带宽的时候通常会拆分成两个部分:读带宽和写带宽。而这两种场景在单独分析时,通常上只在Tx或Rx一个方向上有数据(不知道Tx和Rx是啥的请留言),这个时候就只计算单向带宽。做带宽利用率计算的时候,也只用实际带宽/单向理论带宽来计算。但实际上有一些数据请求者是可以同时发出读请求和写请求的,比如现在对数据传输效率有要求的DMA都能支持这个功能,这个时候对DMA而言,我们依然用读实际带宽和写实际带宽来评估;而如果你要问PCIe的带宽利用率,这个时候就用双向理论带宽来计算。所以请大家不要过多纠结这个问题,讲清楚这个东西背后的逻辑是想告诉大家,在实际工程上要去怎么思考问题,毕竟这个才是重点。

协议开销分析

在此之前我们需要先理解开销这个概念,英文叫Overhead。定义总线的目的本身是为了传输数据,而总线为了高效安全的传输数据,就需要定义一些额外的命令控制字段与响应字段。也就意味着总线在传输数据的时候引入了本身不是数据的信息。宏观上来讲,这些不属于数据的信息都叫开销。所以互联网上目前所见到的讨论PCIe带宽的文章都是用(数据量 / 数据量 + 开销)这个公式来分析带宽的。因为数据量是比较好定的,PCIe的Length字段就能指明数据量,所以这个事情其实应该叫做开销分析,而不应该叫带宽分析。开销分析是为了让你更懂协议,而带宽分析我们上面讲过了,要从定义出发。

我们从协议给出的一张图来逐步分析PCIe的开销来源。

图片

协议开销或者叫TLP开销

Figuer 4-7中间部分有个叫TLP generated by Transaction Layer的部分,这部分其实一个完整的TLP。TLP的构成如下图。

图片

我们上面讲到除了数据部分,其它部分都算开销。所以从协议层引入的开销包括TLP Prefixes、TLP header以及TLP Digest。

TLP Prefixes的个数是根据具体的设计定的,为了对PCIe在功能上做扩展,PCIe ATS功能就是一个例子,需要借助TLP Prefixes传输更多信息。

TLP Header分3DW和4DW两种类型。其中有个非常重要的字段叫length字段,它定义了Data Payload部分的字节数,PCIe一个请求的最大数据量为4096 bytes。从(数据量 / 数据量 + 开销)这个公式来看,数据量越大带宽利用率越高。但实际上PCIe定义了MPS(Max_Payload_Size)和RCB(Read_Completion_Boundary)两个因子来限制PCIe一个请求中能携带的最大数据传输量。这是基于系统带宽平衡上的考虑。在做系统性能优化的时候,这两个信息是可以调整的。

TLP Digest是个4bytes的ECRC可选字段。

以上分析的都是带Data Payload字段的开销,实际在数据传输过程中,还有额外的一些不带Data Payload的TLP会占据链路,而这些是不容易能分析到的。所以我们再回顾一下实际带宽分析的做法:要从带宽的概念出发。

链路层开销

回过头再看Figuer 4-7,TLP下发到链路层会加上TLP Sequence Number和LCRC。除了加入的这两个字段的开销之外,链路层还有Ack/Nak机制和流控机制会带来额外开销,他们分别用来管理TLP传输的健壮性和高效性。

物理层编码开销

再回头来理解下最开始那种表,这张表的最后一列是计算了物理层编码开销之后带宽,它既不是理论带宽也不是实际带宽。我们只需要掌握这样一个概念就行了,它的实际意义不大,也就是说工程上一般不用这个信息来做任何事:在Gen1和Gen2上物理层8B/10B编码开销是1/5,这时候编码开销算是个比较大的影响。在Gen3/4/5上物理层采用了128b/130b的编码策略,其实这时候编码开销带来的带宽影响已经不是那么严重了。在Gen6和Gen7上物理层使用了PAM4编码,这时候其实已经没有编码开销了。

物理层Symbol开销

再回头看Figuer 4-7,TLP在物理层的时候要加上STP Frame Symbol和End Frame Symbol。加这两个Symbol的目的是在RX侧解析的时候能找到TLP的开头和结尾。这两个Symbol会带来一定的开销。

DLLP在物理层上也会加入SDP Symbol和End Symbol,这也会引入很小的开销。

物理层为了做链路两侧设备的CDC问题(很多文章介绍的时钟补偿技术,用于弥补发送侧和接受侧时钟抖动引入的数据传输问题,其实就是CDC问题,CDC即跨时钟域处理)引入的SKP Order Set的传输也会占据链路,所以也会引入开销。

注意物理层对Symbol在Gen3以上速率时有所变化。传输DLLP时会带两个SDP Symbol,传输TLP时会带4个STP Symbol。End Frame Symbol也会变成4个。

再啰嗦一下,我们讨论开销分析的好处是能对PCIe的整个处理流程更熟悉。但要注意的是,落到产品上,在做PCie实际带宽分析的时候还有更多影响因子要考虑。

PCIe实际带宽分析

我们用协议中的一个PCIe拓扑结构图的例子作为简化模型来讨论怎么进行PCIe带宽分析。

首先要交代几个背景:

  1. 在市场上,CPU、Root Complex、Memory这三个东西一般是一个开发商实现的。Switch可能是另一个开发商的产品。PCI Express Endpoint又是另一个开发商。

  2. 实际系统中可能没有Switch。

  3. 我们讨论最右侧双向红色箭头的Memory到EP的数据搬运过程。我们假设EP实现的有设备侧存储。Memory一般就是主存。

  4. 我们把带宽分析的内容也要简化到只有主存和设备存储之间的数据搬运这一条通路,因为整个系统的性能分析还受各个开发商的实现方案影响。比如主机和设备侧如果都实现了多Master访问存储的情况,如果其他Master也在工作,就势必会抢占带宽。而系统性能的分析就是根据多Master之间的仲裁策略给各Master提供够用的QoS。

图片

主存到设备存储的数据搬运一般有两种方式:1)CPU的Load/Store指令方式(RISC处理器系统的访存指令);2)设备侧会实现一个DMA用来做主存到设备存储的数据搬运。当前的主流都是用DMA做数据搬运。

我们在做带宽分析的思想就是定义一批数据量(一般从MRS定义的数据量开始,大到可能有2MB、4MB,甚至更多的数据量),然后统计从数据搬运到指令开始到所有这些数据搬完所花费的时间,然后用数据量/时间计算出带宽。

用DMA做数据搬运影响PCIe性能的最大因素有两个:一个是MPS和RCB值;一个是DMA工作机制。

  1. MPS影响写带宽,RCB影响读带宽。在枚举过程中系统会把所有PCIe设备的这两个值设置为所有设备中最小的值。但是依然可以调节来做试验。

  2. DMA最开始的问题在于它对数据的搬运过程是受控于CPU的,就是说它的工作流程一般是这样的:

    1. CPU配置DMA的寄存器(起始地址、目的地址、搬运的数据量)。

    2. CPU启动数据搬运(配置DMA的Start寄存器)。

    3. DMA搬运完数据报中断。

    4. CPU处理DMA中断,清除DMA中断。

    5. CPU开始下一轮数据搬运,重复上述过程。

这样DMA在每两笔数据搬运之间总要插入一段CPU指令以及中断处理过程。而DMA技术的演化过程也就一直在致力于消除这个过程。LinkList技术、Shadow Register技术、Doolbell技术等都在这个方向上做努力。

  1. 其它影响因子

    1. PCIe Ack/Nak机制可以支持多个TLP返回一个Ack,减少了Ack DLLP包的个数。

    2. PCie的灵活路由技术可以减少排队阻塞。

以上还只是能想到的PCie本身的因素。实际上整个数据搬运过程中的各个组件都可能会有影响PCIe性能的设计,比如缓存大小不够就会导致频繁反压,DDR本身性能还未优化到最佳。

做个总结

我们一直提到PCIe是个系统问题,PCIe的带宽分析也是个系统问题。如果对系统方案不熟悉那做PCIe性能分析那是不全面的。对PCIe做带宽分析实际上是各个开发商内控的过程,因为在做产品标的的时候,一般不会给出PCIe实际带宽是多少。而实际做产品性能分析的时候更多的要考虑总体性能,这时候就要分析影响整个系统性能的因子,这就会变的更复杂。

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

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

相关文章

掌握Transformer之学习各组件

01 引言 这是我关于Transformer系列的第二篇文章。在前一篇文章中,我们了解了Transformer结构的功能、相关架构及其相比于RNN架构的优势。在本文中,我们可以深入了解Transformer结构的工作原理。我们将通过实际的矩阵表示来了解数据如何在该结构内流动…

如何构建高效快速的数据同步策略方案

在数据化的商业环境中,实现数据的实时同步不仅是提升企业内部协作效率的关键,更是确保业务决策精准性和时效性的核心要素。通过确保数据的一致性和最新性,企业能够实现跨部门的无缝协作,从而为业务流程的顺畅运作和快速响应市场变…

比 GPT-4 便宜 187 倍的Mistral 7B (非广告)

Mistral 7B 是一种设计用来快速处理较长文本的人工智能模型。它采用了一些特别的技术来提高速度和效率,比如“分组查询注意力(grouped-query attention)”和“滑动窗口注意力(sliding-window attention)”。 这些技术…

python中如何打印日志信息推荐logaid库(强大的日志库)

一、安装 pip install logaid二、使用 只打印,不保存 from logaid import loglog.info(hello world) log.error(hello world) log.warning(hello world) log.fatal(hello world,123,{},[],False)开启超级print from logaid import log log.init(print_proTrue)prin…

长沙自闭症寄宿学校推荐,为孩子开启光明未来

在长沙这座历史悠久而又充满活力的城市中,自闭症儿童的成长与教育问题牵动着无数家庭的心。家长们渴望为孩子找到一所能够提供专业康复、温馨关怀与全面教育的学校,为他们的未来铺设一条光明之路。虽然本文起始于长沙的期盼,但我们的目光已跨…

多态(上)【C++】

文章目录 多态的概念多态的实现多态产生的条件什么是虚函数?虚函数的重写和协变重写协变 析构函数的重写为什么有必要要让析构函数构成重写? 多态的概念 C中的多态是面向对象编程(OOP)的一个核心特性,指的是同一个接口…

UE4_后期处理六—夜视仪、扫描线

参考:在虚幻引擎中混合材质函数 | 虚幻引擎 5.4 文档 | Epic Developer Community (epicgames.com) 效果: 知识储备: 混合材质函数: 这些函数用于将一种颜色与另一颜色混合,这类似于PS中的混合模式。 混合 是一种函数类型,这类…

因MathType导致word复制粘贴失败,显示:运行时错误‘53’

问题:运行时错误‘53’:文件未找到:MathPage.WLL 解决方法:打开MathType所在文件夹 右击MathType图标->点击“打开文件所在位置”->找到MathPage.WLL文件。 然后,把这个文件复制到该目录下:C:\Progr…

UE5-俯视角色移动(蓝图)01

效果如下: 蓝图节点如下: 使用示例自带的移动蓝图,发现角色只能平移,不会转向。必须勾选以下选项: 点击蓝图-》组件-》SpringArm节点。在细节中找到摄像机设置,勾选以下: 在 点击蓝图-》组件-…

智能化大数据平台引领企业迈向精准决策时代

随着科技的飞速发展,大数据平台正逐步迈向更加智能化和自动化的未来趋势。未来的数据平台不仅仅是一个简单的存储和处理数据的工具,而是一个能够自主学习、优化和做出决策的智能系统。这一转变将极大地改变企业处理数据的方式,提高决策的速度…

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…

[机器学习]逻辑回归

1 前置知识 逻辑回归解决二分类问题。sigmoid函数:非线性,值域(0,1)概率值 2 逻辑回归原理 3 癌症分类案例 import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import Standa…

Python爬虫案例七:抓取南京公交信息数据并将其保存成excel多表形式

测试链接: https://nanjing.8684.cn/line4 思路:先抓取某个类型下的某一条线路所有数据,然后实现批量,,列举出三个类型代表既可 源码: from lxml import etree from xlutils.copy import copy import requests, os, xlrd, xlwtd…

【计算机网络】电路交换、电报交换、分组交换

【计算机网络】电路交换、电报交换、分组交换 目录 【计算机网络】电路交换、电报交换、分组交换1. 电路交换2. 电报交换3. 分组交换4. 基于分组交换~“虚电路交换”技术 1. 电路交换 电路交换(Circuit Switching):通过物理线路的连接,动态地…

为什么总是分心?(影响专注力的5因素)

【Ali Abdaal】Why You’re Always Distracted - 5 Mistakes Ruining Your Focus 介绍 在这个视频中,将讨论影响你注意力的五个主要因素。 内容将深入研究如何提高专注力、避免分心,从而更有效地投入到你的工作和学习中。 视频提供了一些实用的技巧和…

redis群集的三种模式

目录 一、redis群集有三种模式 二、redis主从复制 2.1 概念 2.2 主从复制的作用 2.3 主从复制流程 三、搭建redis主从复制 四、redis哨兵模式 4.1 概念 4.2 哨兵模式原理: 4.3 哨兵模式的作用: 4.4 故障转移机制: 4.5 主节点的选举&#xff…

Python编码系列—Python工厂方法模式:构建灵活对象的秘诀

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

Vue组件:模板引用ref属性的使用

Vue 组件系列文章: 《Vue组件:创建组件、注册组件、使用组件》 《Vue组件:使用Prop实现父组件向子组件传递数据》 《Vue组件:使用$emit()方法监听子组件事件》 《Vue组件:插槽》 《Vue组件:混入》 《Vue组件…

解读工控, PLC+组态能替代DCS吗?

在工业自动化的浪潮中,技术的不断进步正在重塑我们对于控制系统的传统认知。前几天听到一个颇为有趣的观点——现代的DCS可以被看作是PLC加上组态的结合体。这个观点引发了我的深思,因为它不仅触及了工业自动化领域的技术变革,也反映了在数字…

基于Python的电影票房数据分析系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的电…