cuda程序优化-3.通信简介

news/2024/10/2 8:40:13

硬件结构

CPU<->GPU: 通过PCIe进行通信

GPU<->GPU: NVLink, 通过Switch桥接器辅助访问其他卡的HBM

多机通信: InfiniBand with GPU Direct RDMA(简称GDRDMA), 需要专用网卡

image-20240617171442849

卡间通信-Ring AllReduce

nvidia文档

1. 初始状态

image-20240617161007492

卡数: N(该图为4), 总数据量为K.

在RingAllreduce算法中, 会进行2*(N-1)次通信, 单节点通信总量为 N*K-N/K, 首先会把单卡上的数据平均分成N份

2. Scatter

在scatter阶段, 会进行(N-1)次通信, 每次通信量为 K/N, 单节点通信总量为 (K/N)*(N-1) = K-N/K

image-20240617161650471 image-20240617161702225 image-20240617161715518

3.Allgather

在Allgather阶段, 会进行(N-1)次通信, 每次通信量为K, 单节点通信总量为K*(N-1)

image-20240617161747225 image-20240617161826281 image-20240617161842178

多机通信-Double Binary Tree(DBT)

nvidia介绍文档

image-20240617172740143

以上图为例, 整个集群有32个节点需要进行AllReduce, 这里每个节点代表一台server, 这个算法中每个节点最多成为一次叶节点和另一颗树的非叶节点. (比如节点3, 在右边子树里, 接受来自1,5的reduce数据, 再发给父节点7, 而在左子树里作为叶节点把单机RingAllreduce的结果发送给2) 这种结构保证了每个节点都能从2个子节点接收和发送数据,也都能向2个父节点发送和接收数据。

在并行通信方面, 因为2棵树的数据来源不同, 使得可以2棵树的通信可以完全流水线并行, 在单棵树内当叶节点完成节点内的RingAllReduce+send出去后, 他自身就变成了完全空闲的状态, 得等多层父节点类似于fp/bp的方式把reduce结果给广播回来, 而在这段等待的时间内, 节点3可以作为另一颗树的父节点来参与数据通信. 这样就能很好的平衡每个节点的通信量和负载, 从而达到流水线并行的目的

image-20240617180324857

因为DBT的通信次数是O(logN)级别, 而Ring的通信次数是O(N)级别, 所以在大量节点的情况下会产生非常明显的性能收益, nvidia在博客里写到在2w+节点上, 用DBT的性能比Ring要好180+倍.

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

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

相关文章

【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法

SSL: CERITIFICATE_VERIFY_FAILED certificate verify failed: unable to get local issuer certificate问题描述 访问App Service的高级工具KUDU站点的URL,遇见无法访问,在通过az webapp deploy发布时候,也遇见SSL错误 (SSL: CERITIFICATE_VERIFY_FAILED certificate verif…

计算机组成原理学习 Part 2

系统总线 总线 连接各个部件的信息传输线,是各个部件共享的传输介质 结构单总线 面向 CPU 的双总线 以存储器为中心的双总线 三总线 三总线的又一形式 四总线分类片内总线:芯片内部的总线 系统总线:计算机各部件之间的信息传输线\[ \begin{cases}数据总线 & 双向 \quad…

NumPy 差分、最小公倍数、最大公约数、三角函数详解

NumPy 助你处理数学问题:计算序列的差分用`np.diff()`,示例返回`[5, 10, -20]`;找最小公倍数(LCM)用`np.lcm()`,数组示例返回`18`;最大公约数(GCD)用`np.gcd.reduce()`,数组示例返回`4`;三角函数如`np.sin()`,`np.deg2rad()`用于角度弧度转换。别忘了`np.arcsin()`等反…

LVGL line组件

目录Line(线条)的概念线条组件的使用创建线条对象设置点数组确定y轴的方向(可选)设置线条风格(可选)创建风格设置风格将创建好的线段组件添加到父对象上示例代码:运行结果 Line(线条)的概念线条组件的使用 创建线条对象设置点数组 line组件的实现原理就是通过连接两个…

课堂测试企业族谱分析1-4问

第一问: 查询: 第二问: 查询公司的股东 可视化:可隐藏和展开: 第三问: 投资可视化,查询公司名称: 也可以隐藏和展开: 第四问: 一个公司的图谱用左右树图来可视化: 也可以隐藏和展开: 剩下的第五问第六问明天发

第一周:时间复杂度该怎么看?

文章小结: 1.算法时间复杂度是什么官方定义:算法在编写成可执行程序后,运行时所需要的资源,资源包括时间和内存。解读:可执行程序运行所需要时间的一个量化指标。例如O(1),常量级。 2. 常见的时间复杂度O(1) :常量级 O(n):线性 O(logn):对数 O(nlogn) O(n^2):平方 O(…

提升效率必备VSCode运行快捷键全攻略

哈喽,大家好,我是木头左!快速编译与执行 在开发过程中,频繁地编译和执行代码是必不可少的。而在VSCode中,通过简单的键盘操作即可完成这些操作,无需鼠标点击或多余的步骤。 Ctrl + Shift + B or Cmd + Shift + B 这个快捷键用于编译当前打开的文件。按下它,VSCode会使用…