深入分析高性能互连点对点通信开销

news2024/11/15 22:54:03

今天分享最近阅读的一篇文章:“Breaking Band,A Breakdown of High-Performance Communication”,这篇文章发表在ICPP 2019会议。由加州大学欧文分校和ARM公司合作完成。从题目中可以看到,这篇文章是一篇评测型的文章,它主要对高性能网络点对点通信中的各部分开销进行了比较详细的分析。本文将首先介绍论文的研究背景与论文最核心的贡献,以及本文涉及到的一些相关知识。然后介绍论文的评测方法,评测结果,以及作者提出的一些优化方案。

1.研究背景及论文的主要贡献

我们知道,高性能网络通信的两个永恒的目标是高带宽和低延迟。其中,通信带宽主要受限于底层网络器件的物理带宽,随着底层芯片制造技术的不断突破,网络带宽也在稳步增长,当然,前提是有足够的CPU核进行通信;而与之相反,通信延迟主要由主机软件栈和I/O子系统共同决定。换言之,通信延迟与软件执行开销密切相关。因此,作者认为,为了进一步优化网络通信延迟,需要对软件通信开销和I/O子系统有进一步的了解。作者在论文中着重分析了点对点通信路径上各个组件的延迟开销,并提出了一个问题,即通信路径上的某个组件得到了一定的性能提升,整体通信性能能获得多少收益?

2.相关知识

首先是UCX通信框架介绍,作者在论文中使用的通信框架就是这个UCX。UCX是一个用于数据处理和高性能计算的通信框架,其目标是为应用提供统一的通信接口。UCX处于应用层和驱动层之间,它屏蔽了底层不同通信网络的差异,为应用提供统一的通信接口。UCX本身分为两层,其中UCP层实现高层接口,ULP层实现与底层通信网络的对接。UCX提供的通信接口主要可以划分为三类,即图中高性能计算使用的API,I/O访问的API以及通信连接的管理。

其中HPC API包括Tag Matching和Active Message接口。

I/O API包括流式接口,远程过程调用等。

连接管理包括地址解析,连接建立与断开等。

目前已经有很多项目迁移到UCX框架上,例如Nvidia的NCCL,主要实现GPU之间的通信;以及OpenMPI,MPICH等MPI通信库。论文的所有分析都是在UCX通信框架下完成的。

同时,为了追踪网络通信过程中在I/O子系统中的开销,作者使用了PCIe协议分析仪来抓取PCIe数据包。这也是作者自述与其它评测不同的地方。PCIe设备接入PCIe流量探测卡上,探测卡位于PCIe设备和主板PCIe插槽之间,捕获设备发送和接收的PCIe数据包,然后经过PCIe协议分析仪解析后在终端显示。(这里论文作者还提到了自己使用的最先进的风扇制冷系统 :-))。

下图给出了一个PCIe的流量示例。这里抓取了4个PCIe数据包,并按照PCIe的包格式进行显示。同时,每个包还会附带一个时间戳,该时间戳可以用于计算两次PCIe事务之间的时间间隔。除了PCIe流量,现在的PCIe协议分析仪还可以解析更高层次的协议,比如这里的四个PCIe包实际上是一个NVMe读请求的响应。

另外需要介绍的就是软件编程时使用的内存屏障。所谓内存屏障,按照维基百科给出的释义,指的是编程人员告诉CPU或编译器在进行操作的时候,严格按照一定的顺序来执行。屏障前后的指令不会由于系统优化等原因而乱序执行。那么,为什么需要内存屏障呢?下面给出了一个例子,两个线程在不同的核上运行,线程A通过修改flag来通知线程B获取data的数据。对于线程A,两条指令之间没有依赖关系,因此,出于优化考虑,第二条指令可能被调度到第一条指令之前。所以可能会产生以下不同的执行顺序。在第二种情况下,线程B首先捕获到了flag的更新,但此时data可能还没有全部写入,因此,读到的是还未更新的数据。注意这里是非预期结果而不是错误结果,这是因为站在编译器的角度来看,两个线程的执行结果都是正确的,但实际上线程A的指令有着隐含的顺序依赖关系。

Kernel提供了内存屏障,或者叫内存栅栏。方便编程人员告知底层软硬件保证内存屏障前后的指令不得乱序。在添加了内存屏障之后,线程A的两条指令保序执行,确保两个线程正确地进行数据同步。

在网络通信中,写门铃之前要设置内存屏障,以确保网卡在收到门铃后能够获取正确的描述符信息。预期的顺序是CPU准备描述符,写门铃,网卡读取描述符。但实际上写门铃的指令可能被调度到准备描述符之前,所以需要加入内存屏障来确保执行顺序。需要补充的一点是X86 CPU对于in/out指令不会重排序,因此如果访问I/O用的是PMIO而不是MMIO,可以省掉内存屏障的操作。毕竟内存屏障有一定的开销。

3.评测方法

系统由两个节点通过交换机连接。在网卡和主板之间接入PCIe逻辑分析仪。通信软件使用的是MPICH以及UCX框架。其中软件部分的开销通过读取CPU计时器获取,I/O子系统,网卡和交换机的延迟通过逻辑分析仪的时间戳获取。

4.注入开销与端到端延迟分析

作者评测的内容主要包括注入开销和端到端延迟。

首先是注入开销的评测。注入开销指的是软件连续发送请求时,网卡收到的不同消息之间的时间间隔。在同步发送模式下,软件每次Post之后一定要Poll一次完成事件才能继续发送。这其中包括使用PIO发送门铃和描述符,发送网络数据到对端,接收响应ACK,写完成事件,写回内存。实际上在第一次Post后,如果发送队列还有空闲,可以继续Post,来掩盖I/O子系统和底层网络的延迟。

也就是图中所示的异步处理。在p次Post之后,对应地去轮询p次完成事件。平均而言,网卡观察到的注入开销就是Post和Poll的开销之和,同时加上通信框架更新统计数据的开销。

接下来作者对实际的注入开销进行了评测。实验中软件连续发起Post请求,使用逻辑分析仪记录两次MemWr之间的时间差,这个时间差就是实际的注入开销。测试值与估算值的误差小于5%。

然后是端到端延迟的分析。其中Post和Poll的开销通过CPU定时器获取。

PCIe写延迟的时间通过计算MemWr和其对应的ACK的时间差获取。

网络延迟通过计算NIC接收到MemWr和NIC写完成事件的时间差获取。这里NIC接收到MemWr是指消息到达网卡,写完成事件则代表对端将ACK返回。因此,其时间差就是网络延迟。

最后一项RC-To-Mem,指的是RC收到PCIe包后写入内存的延迟。该项通过重复的ping-pong测试获取。即网卡收到一个pong消息时,写完成事件,同时,经过I/O子系统和CPU的一系列处理,再发送一个ping消息到网卡。因此,RC写内存的时间可以通过上述时间差减去其中PCIe和软件的开销获取。

通过前面公式估算出的延迟与真实测试的延迟误差小于5%。

接下来我们把前面测试的各项开销按照百分比的方式展示出来,观察它们在开销中所占的比例。从端到端延迟划分来看,主要延迟耗费在了软件处理和I/O子系统上。对于软件产生的开销,HLP代表高层通信框架开销,LLP代表底层通信接口及驱动引起的开销。高层抽象将软件开销翻了一倍多。

5.优化方案

通过对上述通信过程的分析,作者提出了可能的通信方案。

其一就是观察到在整体通信延迟中,I/O子系统占据了很大一部分开销,因此,将CPU与网卡进行集成能够有效地消除这部分延迟。图中横轴代表的是降低某部分开销的比例,纵轴代表的是性能提升。最上面的数据线是下面两条线之和。可以看到,在极端情况下,当I/O子系统的开销降低90%,系统延迟能够降低35%。另一方面,在底层网络延迟方面,虽然从计算结果来看,将网络延迟降低90%能够带来约25%的延迟下降,但是,目前SerDes的带宽越来越高,这意味着PAM也越来越高,从而造成FEC更加复杂,反而会增加一定的延迟。作者对网络器件本身延迟的下降持悲观态度。

接下来我们看一个实际的CPU集成网卡的示例。这个是日本的K Computer使用的互联方案。CPU是在ARM架构的基础上做了进一步定制,每个CPU与一块本地的HBM高带宽内存直连,不同的CPU通过片上互连构成NUMA架构。同时,芯片上集成了6个网络接口,CPU通过片上互连访问这些网络接口,避免了PCIe及I/O子系统带来的开销。同时,每个网络接口和一个路由器连接,外部接入一个6D Torus网络。

这张图给出了从Tofu1到TofuD的端到端延迟分析。可以看到,在三代互连结构中,延迟下降了50%左右。接下来我们一项项看这些优化。首先是Rx CPU,下降的延迟来自于Cache Injection技术,该技术从Tofu 2代开始使用,网卡将数据直接写入CPU Cache,减少CPU访存开销,类似于Intel DDIO技术。从Tofu1到Tofu2,Tx和Rx的Host Bus被优化掉了,因为从Tofu2开始,网卡被直接集成在芯片内部。Rx TNI的和Tx TNI的延迟下降,一方面是网卡本身架构上的优化,另一方面,对于Tx TNI,从Tofu2开始,网卡能够直接从CPU寄存器中获取请求描述符,进一步降低了延迟。而Tx CPU的下降并不明显,这部分主要是发送方准备描述符等软件操作,依赖于CPU主频的提升和Memory延迟的降低。比较有意思的是Packet Transfer这部分,以下只是个人猜测。从Tofu1到Tofu2,Packet Transfer增加了很大一部分,我们刚才提到过,SerDes带宽的提升可能会造成延迟的增加,这部分增加的延迟可能来自于此。到了TofuD,这部分延迟又降下来了,那么我们猜测是不是TofuD的带宽并没有Tofu2高呢?后者的Link Bandwidth确实比前者要低,所以延迟的下降可能是这个原因。

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

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

相关文章

大厂秋招真题【单调栈】Bilibili2021秋招-大鱼吃小鱼

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 小明最近喜欢上了俄罗斯套娃、大鱼吃小鱼这些大的包住小的类型的游戏。 于…

汇编-loop循环指令

LOOP指令是根据ECX计数器循环,将语句块重复执行特定次数。 ECX自动作为计数器, 每重复循环一次就递减1。 语法如下所示: 循环目的地址必须在距离当前位置计数器的-128到127字节范围内 LOOP指令的执行有两个步骤: 第一步&…

记一次线上bug排查-----SpringCloud Gateway组件 请求头accept-encoding导致响应结果乱码

基于公司的业务需求,在SpringCloud Gateway组件的基础上,写了一个转发服务,测试开发阶段运行正常,并实现初步使用。但三个月后,PostMan请求接口,返回异常,经排查,从日志中获取到转发…

js高效函数库Lodash.js

Lodash 是一个 JavaScript 的实用工具库,提供了许多实用且高效的函数,可以简化 JavaScript 编程中的常见任务。 Lodash具有高性能、模块化和易用性等特点,表现一致性以及可扩展,下面将介绍一些 Lodash 的重要特性和用法&#xff1…

解决 VS2022 关于 c++17 报错: C2131 表达式必须含有常量值

使用 VS2022 编译 ORB-SLAM3 加载Vocabulary 二进制ORBvoc.bin 时,在 DBOW2 里修改 TemplatedVocabulary.h 代码显示这样的错误: 编译器错误 C2131 表达式的计算结果不是常数 定位到我的代码中: char buf [size_node] ; 原因 : …

Ultipa Transporter V4.3.22 即将发布,解锁更多易用功能!

Ultipa Graph 作为一款领先的实时图数据库分析平台,即将发布最新版的数据导入/导出工具Ultipa Transporter V4.3.22 以实现对 Neo4j数据源的导入支持。自今年以来,Ultipa Transporter不断增加新功能,除原本支持本地CSV文件导入导出外&#xf…

修改bat文件默认编辑软件

Windows默认编辑bat文件的软件是自带的文本编辑器。无法高亮显示bat中的命令。 修改方式一: 打开注册表文件,变更键值 HKEY_CLASSES_ROOT\batfile\shell\edit\command 对应软件地址 修改方式二: 制作批处理文件,代码如下&#x…

github 开源whisper ros llm

GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision openai whisper ROS LLM https://github.com/Auromix/ROS-LLM/tree/ros2-humble/llm_input

我理解的反射

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 我之前对反射的理解未必…

uni-app:前端实现心跳机制(全局)+局部页面控制心跳暂停和重新心跳

一、App.vue全局中写入心跳 在data中定义变量heartbeatTimer,便于暂停心跳使用在onLaunch中引用开始心跳的方法startHeartbeat()写入开始心跳方法写入暂停心跳方法写入请求后端刷心跳机制 定义变量 // 在全局设置的心跳机制中添加一个变量来保存定时器的标识 data(…

利用API连接抖音外卖与电商平台和营销系统,实现无代码开发的集成

利用API连接抖音外卖和电商平台 抖音来客,作为抖音生活服务商家经营平台,为商家提供一站式经营服务,其中包括入驻、上品、经营和履约等功能。商家可以通过API调用,实现电商平台和抖音外卖的连接,从而优化运营效率。例…

源启容器平台KubeGien 打造云原生转型的破浪之舰

云原生是应用上云的标准路径,也是未来发展大的趋势。如何将业务平滑过渡到云上?怎样应对上云期间的各项挑战呢?中电金信基于金融级数字底座“源启”打造了一款非常稳定可靠、多云异构、安全可控、开放灵活的容器平台产品——源启容器平台Kube…

第二证券:知名私募美股持仓曝光 科技与消费板块成“心头好”

近来,美国证券交易委员会(SEC)网站闪现,高毅资产、HHLR(高瓴旗下独立二级商场基金管理人)、景林资产和千合本钱旗下对冲基金TOP ACE,陆续宣告了到三季度末的美股持仓。 据私募排排网核算&#…

代码逻辑修复与其他爬虫ip库的应用

在一个项目中,由于需要设置 http_proxy 来爬虫IP访问网络,但在使用 requests 库下载文件时遇到了问题。具体表现为在执行 Python 脚本时,程序会阻塞并最终超时,无法正常完成文件下载。 解决方案 针对这个问题,我们可以…

本地部署 Qwen-14B-Chat

本地部署 Qwen-14B-Chat 1. Qwen-14B 概述2. Github 地址3. 创建虚拟环境4. 安装依赖项5. 快速使用6. 启动 web 演示7. 访问 Qwen 1. Qwen-14B 概述 通义千问-14B(Qwen-14B) 是阿里云研发的通义千问大模型系列的140亿参数规模的模型。Qwen-14B是基于Tra…

【Java SE】如何解读Java的继承和多态的特性?

前言 什么是继承和多态,为什么被称为Java三大特性,这两大特性为我们程序员带来了什么影响呢?是让复杂的代码简化了,还是为程序员写代码提供了多样性呢?那让我们一起来揭开这层神秘的面纱吧! 1.继承 1.1为…

日期相关整理

3214. 节日 有一类节日的日期并不是固定的,而是以“a 月的第 b 个星期 c ”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。 现在,给你 a,b,c 和 y1,y2,希望你输出从公元 y1 年到公元 y2 年间的每年的 a 月的第 b 个…

重要功能丨支持1688API 接口对接一键跨境铺货及采购,解决跨境卖家货源烦恼!

在跨境电商运营中,不少卖家都会优先选择1688平台产品作为跨境店铺货源。 必不可少的1688商品详情接口 阿里巴巴中国站获得1688商品详情 API 返回值说明 item_get-获得1688商品详情 1688.item_get 公共参数 请求地址: 申请调用KEY测试 名称类型必须描述keyStrin…

鼠标点击网页任何地方都显示光标闪烁输入状态

出现这种情况的原因 因为大概是用户无意中打开了浏览器无障碍模式中的使用文本光标浏览网页的功能。 对于Chrome浏览器而言就是这样的: 直接按F7关闭这个模式

十倍增量的海外客户开发新方式来了!外贸企业可直接照做

外贸和B2大C型(汽车、房产、保险、教育等)企业出海过程中,除了常见的数字营销(投放)、平台营销、活动营销(线下展会)和内容营销,还有一个批量化可快速复制起量的营销方式&#xff1a…