本文主要是对《Pump Up the Volume: Processing Large Data on GPUs with Fast Interconnects》的阅读,同时记录了自己的一些想法。

本文针对GPU的NVLink进行进一步研究,阅读下来感觉非常前沿,能学习很多insight。所以我将本文总结出来,加深自己的理解,也方便读者阅读。

本文为SIGMOD’20的文章,感兴趣的同学可以下载来自行阅读。

一、前沿与背景

1 背景

贡献:

1 分析NVLink 2.0并理解其性能以及新特性;

2 对接口的传输速度进行实验探究,并采取最后的数据传输策略;

3 提出新的方案使得GPU-CPU能更好的协同工作;

4 测试;

背景部分需要我们了解哈希join算法,文章中使用的无分区的哈希合并,由于该算法能够很好的测试GPU与CPU的性能,所以全文以该算法贯穿,并在NVLink2.0的基础上对该算法进行重设计,使其更高效。

2、PCIe-3.0知识

PCIe具有两种数据传输的原语,memory-mapped I/O(MMIO)以及DMA。其中MMIO将GPU的显存与GPU地址空间相连。CPU使用load和store指令对数据进行访问。

DMA是的GPU能直接访问CPU的内存,而与MMIO的不同点是DMA能直接访问pinned memory。(在我理解来,就是普通的malloc与cudamalloc的区别,respectively)

cudaMemcpyAsync拷贝non-pinned内存通过MMIO,对pinned内存使用DMA的方案。Unified Virtual Addressing使用DMA进行zero-copy,对pinned memory进行访问。

针对Unified Memory,若GPU中没有该数据,操作系统会收到缺页,并把数据从CPU转移到GPU。

3、NVLink 2.0

NVLink控制器由3层组成,即物理层(PHY)、数据链路层(DL)以及交易层(TL)。下图展示了P100 NVLink 1.0的各层和链路。

P100搭载的NVLink 1.0,每个P100有4个NVLink通道,每个拥有40GB/s的双向带宽,每个P100可以最大达到160GB/s带宽。

V100搭载的NVLink 2.0,每个V100增加了50%的NVLink通道达到6个,信号速度提升28%使得每个通道达到50G的双向带宽,因而每个V100可以最大达到300GB/s的带宽。

Nvidia Volta GPUs以及IBM POWER9 CPUs支持NVLink2.0。其中一个CPU可以连接6个GPU。每一个方向最高有25GB/s的带宽。文中说,2个GPU就能把CPU的带宽吃满,再多一个GPU就会使得每个GPU带宽降三分之一。

地址转换也有所区别。NVLink处理单元通过遍历CPU的页表来提供地址转换。此外,CPU能将GPU的cache同样保存到L1中,GPU一个计算单元的cache保存到L1 cache中,其他的计算单元都可以看到。

与1.0版本相比,NVLink2.0有更快的带宽,有cache一致性,以及更有效的地址转换。

文章提到,AMD的 Infinity Fabric 以及 Intel CXL 也有类似的特性,但是他们目前商业还不对GPU开源使用。

二、不同连接性能测试

本章节针对不同的连接配置进行了性能的测试,配置与实验结果如下:

性能测试

不同测试路径示意图:

We compare NVLink 2.0’s ➁ performance to GPU (PCI-e 3.0 ➀) and CPU interconnects (Intel Xeon Ultra Path Interconnect (UPI) ➂, IBM POWER9 X-Bus ➃), CPU memory (Intel Xeon ➄, IBM POWER9 ➅), and GPU memory (Nvidia V100➆).

英文列出来吧就不翻译了。

4-byte read accesses on 1 GiB of data

实验结果表明NVLink2.0连续读写比PCIe3.0快5倍,比其他两个快2倍。随机访问更快,分别为14倍以及35%。

图b是与cpu内存访问性能的对比,图c是与GPU内存访问性能的对比。

Cache一致性

GPU可以直接访问CPU内存的任意位置,不需要Pinned memory。分配Pageable memory比pinned memory更快;

PCIe的缺点有:1 数据一致性必须在软件中管理,而不是在硬件中。程序员或者手动刷新缓存,或者操作系统迁移页面;2 系统级别的原子性无法保障;

文中提到,由于PCIe延迟太高,无法很好的应用细粒度的cahce一致性。(具体原因待解释)

在无分区哈希场景下NVLink的好处

首先,由于NVLink 2.0的高顺序访问带宽,我们能够将访问到数据。通过将哈希表存储在GPU内存中,我们保留了GPU相对于CPU连接的性能优势。其次,我们利用NVLink 2.0的低延迟和高随机访问带宽,为任意数据量提供构建端可伸缩性。因此,我们能够将哈希表从GPU内存溢出到CPU内存。第三,我们利用缓存一致性和nvlink 2.0的全系统原子来共享CPU和GPU之间的哈希表,并扩展数据处理规模。

三、CPU与GPU之间数据的传输效率

数据在CPU与GPU之间必须要有传输的操作,而这个过程设计两种模式,Pull模式与Push模式。其中Push为CPU推到GPU中,而Pull为GPU向CPU拉取指定的数据。

下图共有8种方案,push一般为粗粒度,Pull粒度很细,达到page或者byte粒度。

1 Push

Pageable Copy

通过cudaMemcpyAsync发起,然后将数据块直接以pageable内存的形式转移。

Pinned memory

使用DMA对Pinned memory进行访问。该过程使用copy engine,而不是像Pageable memory一样使用MMIO用CPU线程copy。所以很快。

Staged Copy

大量数据使用Pinned memory会加重管理负担,且耗费大量资源。于是Staged Copy使用Pinned staging buffer。首先将Pageable数据块注意到pinned buffer中,然后再copy。

Dynamic Pinning

在传输前将特定的Pageable页面转换为pinned内存。

Unified Memory Prefetch

如果知道要访问什么内容,就可以从CPU预取过来。

2 Pull

哈希访问随机性很大,所以使用Push进行数据块访问性能并不好。

Unified memory migration

使用操作系统级别的页迁移方案,4kb。

zero-copy

使用Unified Virtual Address对数据进行byte粒度的访问,但是必须为Pinned memory,且为硬件主导,不涉及软件或操作系统。

Coherence

NVLink2.0的新特性。使用硬件地址转换,GPU可以直接访问CPU的地址,与Unified memory类似,但是是byte粒度(Unified memory migration为page

粒度),且与zero-copy相比,不需要pinned memory,直接访问Pageable内存。

三、HASH JOINS算法如何在NVLink2.0下扩展

HASH JOINS算法包括两个阶段,建立+探测。而建立阶段需要大量的随机访问,所以对延迟的要求很高,而探测阶段需要很高的带宽。所以也呼应了这个算法能很好的对设备连接性能进行测试。

后面的内容更偏向一个新型方案的设计,我们主要关注NVLink部分,所以后续内容不展开。

四、Insight

全文在使用NVLink+新方案并经过实验测试后,得到了一些insight,这里记录下来:

1 GPU在使用了NVLink2.0后能够非常快的访问CPU内存。所以使得从CPU中load数据成为可能;

2 GPU访问不再是一个严重的问题(快了PCIe3.0有6倍),之后说不定瓶颈就在计算以及显存容量上;

3 GPU内部访存的速度依然是NVLink2.0的6.5倍以上,所以最好还是将数据放GPU中;

4 使用cache一致性连接方案使得CPU与GPU的整体性能比较高;

5 cache一致性使得pinned内存不在需要,内存管理变得简单。

五、总结

NVLink不得不说,是个好东西。它从最基本的出发点解决转移瓶颈的问题,能够很好的加速当今应用。然而当前该设备还没铺开,似乎常用的服务器还是使用PCIe,但是未来的几年后,随着新设备的普及,我认为下面的研究方向就要改变一下,不能一直盯着如何解决PCIe带宽不足这个点,还是需要提出像本文一样,在更快速的NVLink基础上,新的应用若转移不是瓶颈,那么后期新的应用应该怎么发展。

mysql yuancheng nv_GPU前沿:NVLink与PCIe的对比学习相关推荐

  1. MySQL启动、连接,退出,关闭命令学习

    MySQL启动.连接,退出,关闭命令学习 1,启动MySQL服务 net start mysql80 2,连接MySQL mysql -h127.0.0.1 -u用户名 -p密码 回车,出现下面一堆东 ...

  2. MySQL与CVM自建数据库优势_UCloud云数据库MySQL产品优势及与自建数据库对比

    前文,我们了解过UCloudy优刻得云数据库活动<云数据库有什么用?UCloud海外MySQL云数据库促销最低5折>,以及产品介绍<什么是云数据库?云数据库机型版本和产品架构介绍&g ...

  3. JavaWeb项目+MVC三层架构+Mysql+Tomcat+汽车配件销售系统前后端+可以用于学习javaweb项目入门

    JavaWeb项目+MVC三层架构+Mysql+Tomcat+汽车配件销售系统前后端+可以用于学习javaweb项目入门 可以用于课程设计.毕业设计的知识点入门学习 提示:此资源仅用于javaweb网 ...

  4. sql要学mysql还是php,MySQL_与MSSQL对比学习MYSQL的心得(一)--基本语法,这一期主要是学习MYSQL的基本 - phpStudy...

    与MSSQL对比学习MYSQL的心得(一)--基本语法 这一期主要是学习MYSQL的基本语法,陆续还会有续期的文章,敬请期待 语法的差异 我这里主要说语法的不同 1.默认约束 区别:mysql里面DE ...

  5. UCloud云数据库MySQL产品优势及与自建数据库对比

    UCloud云数据库MySQL产品优势及与自建数据库对比 前文,我们了解过UCloudy优刻得云数据库活动<云数据库有什么用?UCloud海外MySQL云数据库促销最低5折>,以及产品介绍 ...

  6. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

  7. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 ​ 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...

  8. pcie中文入门学习文档资料

    网上转载的整理pcie中文入门学习文档和资料,作为备份: 目录如下: 1.前言篇:PCIe扫盲--PCIe简介:http://blog.chinaaet.com/justlxy/p/510005306 ...

  9. 事务隔离机制原理深入分析以及MySQL不同隔离级别分场景下实验对比

    这是我总结的事务的四种隔离机制,比较好理解,主要是有些地方文字游戏说不清楚很容易混淆: Read Uncommitted(读未提交)A未完,B已更新,未提交,A读到B已更新的数据,由于未提交,那么可能 ...

最新文章

  1. mysql的优化——索引介绍
  2. Flask实战1-轻博客
  3. auto.js停止所有线程_十年架构师带你快速上手多线程
  4. jquery层级原则器(匹配后代元素div)
  5. 前端学习(1652):前端系列实战课程之bom
  6. 【2016年第4期】研究(国家自然科学基金项目成果集萃)导读
  7. gitlab 删除仓库
  8. “Git 不是昙花一现!”
  9. (十)OpenCV相机标定
  10. matlab plv,脑电脑网络分析代码使用流程介绍
  11. 游戏服务器架构,配置
  12. 空气质量等级c语言编程,编程小白如何快速处理空气质量数据
  13. C#自定义好看的消息提示窗口MessageBox
  14. 在检查计算机更新时发现错误,修复在 Acrobat Reader 更新期间出现的 Windows 错误...
  15. c语言日历时钟编程,基于DS1302的日历时钟(1602液晶显示DS1302时钟)C语言程序设计...
  16. 异步请求 ajax的使用详解
  17. 如何输入带空格的字符串
  18. mean shift应用_使用Google地图制作MEAN应用(第二部分)
  19. 网友感到担忧!iOS 17支持第三方应用商店:这下跟安卓没区别了
  20. 【Paypal】即时付款通知IPN

热门文章

  1. 健身瑜伽游泳篮球馆多门店私教课程预约会员卡小程序开发
  2. Java学习笔记一Tomcat 8.5 的WebSocket 支持
  3. 编译配置(1)——ARMv7,ARMv8(AArch64) 浮点配置等相关知识
  4. 梦幻西游python验证成语,Python爬取成语信息
  5. 时间序列分析教程(五):Box-Jenkins方法(上)
  6. php二层联动,php怎么实现二级联动菜单
  7. 最大熵模型原理和定义
  8. 2,Java语言基础-Java语言基本程序设计知识
  9. 个性化营销:您需要知道的信息
  10. Vmware 分辨率设置