论文导读 | GPU与LSM-tree的优化--以加速compaction和scan为例

news2024/12/25 1:08:05

GPU是一种新硬件,相比较于CPU,有较高的读写带宽和更强的并行能力,在很多领域都有非常好的应用。今天我们以LSM-tree上的compaction和scan为例,介绍GPU如何在加速数据库的操作中发挥作用。

一、GPU的发展历程

图1:GPU的发展

GPU发展之初,是作为集成单元与其他硬件聚合在一起,也就是我们所熟知的显卡。1999年,NVIDIA发布Geforce256,正式提出GPU概念;2006年,NVIDIA发布GeForce8800,发布CUDA,一种后面得到广泛使用的GPU编程语言;2011年,NVIDIA发布Tesla系列,形成计算产品线,GPU开始更多地应用于科学计算领域。2011年至今,GPU快速发展,主要被NVIDIA和AMD所垄断,一些国产公司也开始研发一些替代品。

现在,GPU在CUDA语言的基础上,提供了对于多种语言如C++、python的支持,并且有很多现成的算法库用来进行深度学习,矩阵乘法,通用计算等等。这些很大程度上降低了GPU编程的门槛,使得GPU的进一步广泛应用成为了可能。

目前GPU的主要应用有三个领域:

1) 通用高性能计算,例如自动驾驶、智慧医疗、生命科学、云计算、数据处理、金融等方面。

2) 人工智能计算。

3) 图形计算。

2021图灵奖于近日揭晓,高性能计算先驱Jack Dongarra获奖,以表彰他在高性能计算领域所做出的突出贡献。他曾经说“未来的计算结构会是CPU和GPU的结合。”可见GPU正越来越受到大家的关注和认可。

提到GPU的发展,我们就不得不提NVIDIA一年一度的技术大会(GTC),每次都会发布最近的技术或产品。GTC 2022于3月22日召开,发布了NVIDIA的最新一代GPU H100。它采用的是台积电4nm工艺, 拥有800亿晶体管;对比A100,有300%~600%的性能提升;一块 H100 的 IO 带宽就是 40 terabyte 每秒。

“为了形象一点说明这是个什么数字,20块英伟达 H100 带宽就相当于全球的互联网通信。”黄仁勋说道。

同时,NVIDIA宣布基于 H100 芯片即将自建一个名叫 EoS 的超级计算机,其由 18 个DGX POD 组成,一共 4608 个 H100 GPU,从 AI 计算的角度来看,EoS 输出18.4 Exaflops,是当今全球第一超算富岳的四倍。NVIDIA表示,阿里云、亚马逊AWS、谷歌云和微软Azure等大公司都将采用英伟达的新芯片。此外,戴尔和惠普企业等计算机制造商将提供基于这些新芯片的计算机。除此之外,新一代的H100也提供了许多新特性,例如支持机密计算、加速动态编程算法、新一代NVLink等等。

可以看出H100相比较于上一代的A100,有巨大的性能优势,是NVIDIA发布的又一个里程碑式的产品。

近年来,国产GPU也有了长足的发展。3月30日下午,北京GPU创企摩尔线程推出基于架构MUSA的首款GPU苏堤,以及基于苏堤的首款台式机显卡MTT S60、首款服务器产品MTT S2000。摩尔线程创始人兼CEO张建中为前英伟达全球副总裁、中国区总经理。苏堤是摩尔线程的全功能GPU,有图形、智能多媒体、AI、物理四大引擎,在此之上有各种编译工具及平台,并支持OpenCL、SYCL、CUDA、Vulkan、DirectX、OpenGL/GLES等主流编程接口,还有针对具体应用的各类行业解决方案。特别地,基于苏堤的首款台式机显卡MTT S60,据张建中介绍,是第一款能打英雄联盟游戏的国产显卡,支持所有主流国产PC操作系统。苏堤对于GPU全功能的实现,对于各种主流编程接口的支持,使得它在各种服务器或数据中心中有一席之地;而对于主流游戏的支持,也使得它出现在个人PC上成为可能。总之,这是国产GPU发展的一个重要里程碑,虽然比NVIDIA的旗舰GPU还有一些性能差距,但是国产GPU首次发布出来,并且在商业市场上有一定的竞争力。

图2:摩尔线程发布会现场

二.GPU架构的简单介绍

图3:H100的架构示意图

图3是H100的架构图,可以看出,GPU的架构已经非常复杂,包含了非常多的并行单元和访存控制单元。为了方便介绍,我们还是采用更加抽象和简单的架构图来进行介绍,如图4所示。

图4:GPU和CPU的架构比较

从图4中可以看出,GPU与CPU相比,有非常多的计算单元,但是每个计算单元的逻辑控制器和本地cache都比CPU少。通常这会导致一个结论:CPU适合处理逻辑复杂的任务,GPU适合处理简单但是并行度高的任务。关于这个结论,我们在后文会给出更进一步的解释。同时GPU的内存带宽也比CPU高的多,一般CPU的内存带宽在100GB/s左右,而GPU的内存带宽可以达到CPU的5~8倍。可见GPU相较于CPU,有巨大的硬件优势,但是GPU的硬件架构有自己的特性,要充分发挥出性能优势的条件也更严苛。

图5:硬件层面和软件层面的GPU架构

接下来我们从硬件架构和软件层面对GPU进行介绍,如图5所示。硬件上,一个GPU有多个stream multiprocessor(SM),每个SM上有许多核,并且拥有自己的cache。所有的SM都可以访问全局内存(global memory),global memory通过PCIe总线和CPU相连。通过PCIe方式进行的CPU和GPU的通信带宽并不高,只有十几GB/s的速度,但是通过NVLink相连的方式,能够实现接近十倍的数据传输带宽。软件层面,程序员每次启动的GPU上的核函数称为一个grid,其中有许多的block,block可以被分派到SM上运行。每个block中又有许多warp。Warp是GPU上线程并行和访存的基本单位,其中的线程是按照单指令多线程(Single instruction multiple threads)的形式运行的,也就是说,warp内部线程的中的分支或者循环结构会导致并行度下降。同时warp也是基本的访存单元,warp里的线程的访存任务都是通过warp统一完成的。

图6:warp中线程访存的几种方式

Warp每次取回一个cacheline大小的数据(通常是128Byte)。考虑图6中的访存方式,当一个warp中的四个线程访问的都是连续并且相邻的地址时,所有的访存请求都可以在一次内存访问操作中满足,称为coalesced memory access;如果线程访问的地址空间是相邻并且不连续的,就需要更多的访存操作才能将所有需要的数据取回来,也就是图中的strided memory access;最后如果所有的线程随机访问,那么需要很多次的访存操作才能满足所有的请求,并且取回来的数据中有效的数据非常少。

Warp的并行和访存特性,决定了GPU更加适合处理规则的,简单的任务,也是“GPU不适合处理复杂逻辑”的原因。因而我们在算法设计的时候,必须注意到这一点,充分考warp的特性,尽量避免线程发散,尽量让线程进行合并访存,这是GPU上进行程序设计的基本原则。

三.两个GPU上的工作

接下来我们将通过levelDB和RocksDB上的两个例子,介绍GPU在基于LSM-tree的数据库上可以做什么。

(一)LUDA--利用GPU加速LSM-tree的compaction操作[1]

1.    动机

图7:rocksDB在不同CPU overhead下的性能

Compaction是RockDB中非常重要的操作,可以减少读放大;数据库系统本身对于CPU有很高的占用率,而compaction操作也是计算密集型操作,导致对于计算资源的竞争十分激烈。例如在图7中,当数据库本身对于CPU的占用比较高的时候,稍微增加一点compaction的工作负载就会导致非常所需要的时间急剧增加。我们需要一个有效的方式,减少计算资源的竞争。

2.    compaction的实现

图8: CPU上的compaction操作流程

图8展示了常规compaction操作的流程图。CPU从磁盘上读取出相应的SSTable,经过解码排序编码的方式,将LSM-Tree的不同层合并,然后再写回到磁盘上。

图9:使用GPU加速的compaction流程

在LUDA的设计中,将原本计算操作比较密集的部分-对于SSTable的编码和解码部分的工作交给了GPU,基本流程如上。在LUDA的设计中,GPU对于SSTable的访问需要经过CPU作为中介进行数据的传输。同时对于SSTable进行排序和多版本信息管理的操作放在了CPU上,这是因为多个SSTable之间可能存在范围交叠,这部分任务如果放在GPU上处理会导致CPU和GPU之间大量的数据传输,可能带来非常严重的性能下降。

GPU在进行数据的编码和解码的同时,也会进行其他一些计算密集型的操作,例如构建bloom filter和checksum检查等等,有效地减少了GPU的工作量。

在图9中的步骤二和步骤四中,也就是GPU和CPU之间进行数据传输时,采用的是异步的数据传输,可以有效地提高计算和数据传输的并行性,掩盖数据传输延迟。

3.    实验

图10:不同CPU负载下的吞吐量

图11:不同CPU负载下的运行时间

最终LUDA实现了比较好的加速效果,相比较于单纯地使用CPU,实现了2倍以上的compaction加速和2倍以上的数据吞吐量。

(二)OurRocks:利用GPU加速LSM-tree的SCAN操作[2]

1.    动机

基于NVMe协议的SSD最高能够实现GB/s的数据传输带宽,但是目前基于CPU的LSM-tree数据库对于SSD的带宽应用非常有限,哪怕考虑上多线程技术,AVX技术,异步IO等等,如图11所示,哪怕是在8-client的环境下,在实际业务场景中SSD的真实带宽也仅仅有十几GB/s或者几十GB/s,仅仅是理论SSD最高带宽的几十分之一。

图12:MyRocks处理分析性查询时NVMe的实际带宽

同时,在数据库的扫描操作中,数据从SSD拿入CPU之后,CPU还会消耗大量的时间在计算上,如图13所示,在不同client数目下,系统空间和用户空间的CPU运行占据了绝大多数的时间,花费在系统IO上的时间是很少的。这体现了对于CPU计算任务卸载的需求,和提升SSD实际使用带宽的需求。

图13.Myrocks中处理每个分析性查询时CPU每个核的利用率

同时,利用CPU作为GPU和磁盘之间的数据传输跳板会带来很严重的性能损失,参见LUDA的实现,带来了很多不必要的数据传输开销。

所以MyRocks想利用GPU和SSD之间直接进行数据通信的特性,辅助CPU进行SCAN操作,减少CPU的访存开销和计算代价。

2.    背景知识

LSM-tree中的读操作,由于LSM-tree本身的特性,会带来额外的代价,称为读放大。

NVIDIA GPUDirect RDMA(remote direct memory access)为GPU和其他第三方设备(例如网卡,SSD等)的直接数据传输提供了可能,而不是仅仅通过PCIe总线,这大大减轻了CPU的数据传输负担。

图14: DMA传输的吞吐量

如图14所示,通过对于GPU和SSD之间直接进行数据传输的带宽测试,发现当数据传输的大小达到一定水平时,数据的传输带宽可以稳定在一个水平,这远远高于数据库实际业务场景中的SSD和CPU之间的数据传输带宽。

3.    利用过滤下压使GPU进行预扫描

图15:考虑查询下压的架构图

原本的LSM-tree数据库包括SQL执行引擎和数据存储引擎,MyRocks增加了一个GPU manager,利用GPU进行计算任务的部分预计算。具体过程如下:SQL执行引擎首先对查询语句解析,将其中的谓词(过滤条件)传给GPU Manager;随后数据从SSD传输到CPU,再通过异步方式传输GPU;GPU有了谓词和数据,预先进行数据的筛选,将通过筛选后有用的数据块的位置记录下来,传给CPU;这样CPU就可以省去大量的SCAN操作,直接处理GPU传输上来的过滤之后的数据,大大减少了CPU的工作量。

4.    利用DMA(Direct memory access)加快GPU和SSD之间的数据传输

图16:考虑查询下压和GPU DMA的架构图

上一个设计中的问题是GPU仍然通过CPU获取SSD的数据,这样一方面导致不必要的数据传输延迟,另一方面也增加了CPU的负担。于是在考虑了GPU DMA的特性之后,将原来的架构修改如上。原来通过CPU传输到GPU的数据,不再是大块的数据,而是对于数据块进行描述的元数据,记录数据块的位置和大小等信息,这部分数据的大小相比较于原来数据的大小可以忽略不计。然后GPU可以直接与SSD进行数据的通信,对得到的数据进行扫描。

可以看出DMA的使用大大减少了数据传输的代价,也解放了CPU。

5.    实验

图17: 在YCSB数据集上的实验结果

在TPC-H数据集上执行带有SCAN操作的典型查询,性能比原来提升了6.2倍。

图18: TPC-H的scan操作中各个时间阶段所占据的比例

从整体运行时间中各个阶段所占据的比例来看,使用DMA技术加速的OurRocks也带来了很明显的性能提升,并且CPU的扫描时间和数据传输时间都大大降低。

四.总结与展望

我们介绍了如何利用GPU高带宽和高并行的特点,帮助减少CPU或者内存的压力,从而实现性能提升的例子。原本GPU更加适合计算密集的workload,但是GPU direct RDMA的引入,使得GPU在访存型任务上也获得了很大的发挥空间,很大程度上缓解了CPU的数据传输压力。但是,卸载给GPU的工作做好能够完全跟CPU解耦,否则任务运行过程中依赖CPU实施产生的数据等会导致性能大幅降低。

GPU在各种对性能有需求的场景下的使用是未来的发展趋势。在基于LSM-tree数据库的优化上也有很多潜在的方向。例如利用DMA对于LUDA的改进,encoding过程和decoding过程摆脱对于内存的依赖;在compaction过程的encoding中加一些计算密集型任务,对每个数据块中数据特性进行预计算,方便后续查询时的快速获取;GPU的使用给很多之前被有缺陷的数据库架构设计也带来了一些新的可能,例如Wisckey[3]提出KV分离的设计思路,可以大大减少合并过程中的写放大,但是会带来范围查询性能下降,并且GC过程中存在大量点查的问题,但是合并和GC都是不在数据库查询相应路径上的,GPU可以作为专门的合并或者GC单元。

参考文献

[1] LUDA: Boost LSM- Key Value Store Compactions with GPUs, arXiv Peng Xu et.al

[2] OurRocks: Offloading Disk Scan Directly to GPU in Write-Optimized Database System,Won Gi Choi, IEEE TRANSACTIONS ON COMPUTERS, 2021

[3] WiscKey: Separating Keys from Values in SSD-conscious Storage, Lanyue Lu et.al , FAST 2016

欢迎关注北京大学王选计算机研究所数据管理实验室微信公众号“图谱学苑“
实验室官网:https://mod.wict.pku.edu.cn/

实验室开源产品图数据库gStore:
gStore官网:http://www.gstore.cn/
GitHub:https://github.com/pkumod/gStore
Gitee:https://gitee.com/PKUMOD/gStore

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

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

相关文章

基于uniapp+ssm+mysql一站式婚庆服务平台app设计

开发软件:Idea HBuilder mysql 开发技术: SSM Vue uniapp 用户功能: 注册登陆,填写基本的个人信息,就可以注册,注册完成后即可登陆 查看店铺,在首页有很多的店铺,有婚纱店&…

PHP 精度计算问题(精确算法)

1. PHP 中的精度计算问题 当使用 php 中的 -*/ 计算浮点数时, 可能会遇到一些计算结果错误的问题 这个其实是计算机底层二进制无法精确表示浮点数的一个 bug, 是跨域语言的, 比如 js 中的 舍入误差 所以大部分语言都提供了用于精准计算的类库或函数库, 比如 php 中的 bc 高精…

逻辑回归、激活函数sigmoid、损失及优化、案例代码实现

一、逻辑回归 逻辑回归(Logistic Regression):是机器学习中的一种分类模型,是一种分类算法,与回归之间有一定的联系,由于算法的简单和高效,在实际中应用非常广泛 应用场景:广告点击…

Web入门开发【八】- 学习探索

Web案例详解 简单的个人静态网站,这是一个单页的简单静态web网站,前面已经详细讲过。 这个案例是动态的企业官网,增加了多菜单,动态登录等功能,是入门学习者进阶的实践必做项目。 我们再来看企业后台管理系统&#xff…

Python Yolov5火焰烟雾识别源码分享

程序示例精选 Python Yolov5火焰烟雾识别 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 Yolov5比较Yolov4,Yolov3等其他识别框架,速度快,代码结构简单,识别效率高&#x…

操作系统开启分段并进入保护模式

段基地址 32位的地址,如果没开启分页,指的是当前段所在的物理地址,否则是分页前的虚拟地址 G(Granurality) 值为1表示段界限以4K为单位,否则以字节为单位 段界限 描述段的大小size-1,单位由G决定。 D/B 对于代码段&#xf…

【Linux】缓冲区/磁盘inode/动静态库

目录 一、缓冲区 1、缓冲区的概念 2、缓冲区的意义 3、缓冲区刷新策略 4、同一份代码,打印结果不同 5、仿写FILE 5.1myFILE.h 5.2myFILE.c 5.3main.c 6、内核缓冲区 二、了解磁盘 1、磁盘的物理结构 2、磁盘的存储结构 2.1磁盘的定位 3、磁盘的抽象…

【openGauss】浅试openGauss3.1.0中有关mysql兼容的部分特性

前言 在9月30号,openGauss推出了3.1.0这一预览版(注意,openGauss的“x.y.z”版本号,“y”的位置如果不是0,就不是长期支持版,不建议生产使用)。 这个版本增加了不少新内容, https:/…

【KGAT】Knowledge Graph Attention Network for Recommendation

note 其实不结合KG,何向南团队之前也直接使用GCN做了NGCF和LightGCN。KGAT结合KG和GAT,首先是CKG嵌入表示层使用TransR模型获得实体和关系的embedding;然后在attention表示传播层,使用attention求出每个邻居节点的贡献权重&#…

35岁有儿有女,为什么我开始自学编程?

零基础编程入门越来越容易 这么讲并不夸张:无论你初学哪门编程语言,第一行代码几乎都是打印出 Hello world ! print(Hello world!) print(Hello python!) 遥想当年,花上一两天折腾完各种安装配置调试环境,写下第一句“面世代码…

该怎么选择副业,三条建议形成自己的副业思维

受经济环境的影响,许多年轻人觉得原来稳定的工作不那么稳定,看着周围的朋友因为企业破产和失业,生活变得没有信心,也想找到自己的副业,在紧急情况下赚更多的钱。所以,年轻人在选择副业时也面临着很多困惑&a…

Java --- JUC的CompletableFuture的使用

目录 一、Future接口 二、Future接口的功能 三、FutureTask 四、CompletableFuture背景及使用 4.1、CompletionStage 4.2、CompletableFuture 4.3、四个静态方法 4.4、减少阻塞和轮询 4.5、使用CompletableFuture完成电商大比价 五、CompletableFuture常用API 5.1、获…

【华为OD机试真题 C++】TLV解析 【2022 Q4 | 100分】

■ 题目描述 TLV编码是按[Tag Length Value]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。 码流以某信元的Tag开头,Tag固定占一个字节&#xff0…

机器学习 | 逻辑回归

一.基本原理 面对一个分类问题,建立代价函数,通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏。逻辑回归是一种分类方法,主要用于二分类问题,应用于研究某些事件发生的概率 二.优缺点 …

day28【代码随想录】回溯之组合、组合总和|||、电话号码的字母组合

文章目录前言一、组合(力扣77)剪枝优化二、组合总和 III(力扣216)剪枝优化三、电话号码的字母组合(力扣17)总结前言 1、组合 2、组合总和||| 3、电话号码的字母组合 一、组合(力扣77&#xff0…

第1章 计算机组成原理概述

文章目录前言1.0 课程简介1.0.1 课程的地位1.0.2 课程学习思路1.0.3 课程组成1.1 计算机系统简介1.1.1 计算机组成1.计算机的类型2.计算机的组成3.软件组成1.1.2 计算机系统的层次结构1.物理层方面2.程序员角度1.1.3 计算机体系结构与计算机组成1.2 计算机的基本组成1.2.1 冯诺…

esp8266测试1.44英寸TFT屏(驱动7735)的demo

参考这教程: 使用esp8266点亮福利屏型号st7735的1.44的TFT屏 管脚连接: 我的用的TFT1.44寸ST7735,与NodeMCU针脚接线成功连接 VCC——3V GND——G LED——3V CLK——D5 SDI——D7 RS——D6 RST——D4 CS——D8 这里给出常用的屏幕管脚定义 以及esp8266…

女生也能学编程:行政女生转行学编程获13000元薪资

“女生不能学编程” “女生学编程找不到工作” “企业根本不会招女生” …… 这样类似的说法,让非常多的女生放弃了学编程,但达妹今天要明确的说,这种说法是 错误的! 只要你愿意改变,有梦想,想追求更好的…

想要快速准备好性能数据?方法这不就来了!

[内部资源] 想拿年薪30W的软件测试人员,这份资料必须领取~ Python自动化测试全栈性能测试全栈,挑战年薪40W 性能测试的一般流程 收集性能需求——>编写性能脚本——>执行性能测试——>分析测试报告——>系统性能调优。 在收集性能需求后…

Spring IOC\AOP\事务\注解

DAY1 一、引言 1.1 原生web开发中存在哪些问题? 传统Web开发存在硬编码所造成的过度程序耦合(例如:Service中作为属性Dao对象)。 部分Java EE API较为复杂,使用效率低(例如:JDBC开发步骤&…