论文研读-SIMD系列-基于分区的SIMD处理及在列存数据库系统中的应用

news2024/11/25 4:46:25

基于分区的SIMD处理及在列存数据库系统中的应用

单指令多数据(SIMD)范式称为列存数据库系统中优化查询处理的核心原则。到目前为止,只有LOAD/STORE指令被认为足够高效,可以实现预期的加速,并且认为需要尽可能避免GATHER/SCATTER操作。但是GATHER指令提供了一种非常灵活的方式用来将非连续内存位置的数据填充到SIMD寄存器中。正如本文讨论的那样,如果使用方法合适,GATHER会达到和LOAD指令一样的性能。我们概述了一种新的访问模式,该模式允许细粒度、基于分区的SIMD实现。然后,我们将这种基于分区的处理应用到列存数据库系统中,通过2个代表性示例,证明我们新的访问模式的效率及适用性。

1、引言

单指令多数据(SIMD)是一种并行概念,其特征在于统一操作同时应用于单个指令中的多个数据元素。现代的CPU都支持这样的SIMD指令以及AVX扩展,其中英特尔CPUs是其中代表。SIMD扩展包括2方面东西:SIMD寄存器,比传统的标量寄存器大;SIMD指令。SIM指令集包括算术操作、布尔操作、逻辑和算术移位、数据类型转换。此外还有一些特定的SIMD指令可以将数据从主存加载到SIMD寄存器并将其写回。一方面,连续放在内存中的数据元素可以通过LOAD和STORE指令访问。另一方面,GATHER和SCATTER指令反映了非连续内存访问的替代方式。但是,通常指导原则是,如果可能,尽可能避免使用GATHER/SCATTER,因为他的性能损失比较严重。目前,还没有对GATHER/SCATTER性能进行明确的理解。本文的主要贡献之一就是对不同Intel CPUs的GATHER指令进行了系统的评估。并且关于strided access(跨步访问)模式。评估结果表明,GATHER指令的性能主要取决于跨步访问的应用及步的大小。如果使用合适,GATHER会有接近LOAD指令的性能。另一个贡献,基于分区的SIMD访问概念,提出新型的block-strided access访问模式,并在一个简单的分析查询模型和整数压缩算法中进行比较。

2、GATHER评估

749f37748cb1207bac615074f362606c.png

鉴于AggSum性能依赖于加载指令,所以使用aggregation-sum(AggSum)操作进行评估。AggSum对输入数组进行迭代计算,每次迭代执行加法,最后将总和(单个值)写回主存。图1a使用线性访问模式,利用LOAD指令进行迭代计算。跨步变种使用跨步访问模式,利用GATHER指令。GHATER指令需要给一个数据首地址以及步长。基于此,跨步访问模式又分2种:图1b是传统风格的stride-full,根据步幅加载数据知道数组结束(使用了2的步幅)。处理依次后,移动一次头,然后接着在进行一次迭代,这样依次处理所有数据。图1c是将输入数组逻辑分块,提出stride-block的风格。本例中,定义步长为2,块大小为8。这就意味着,每个大小为8的块,需要运行2次大小为4的SIMD寄存器。因此它并不能像stride-full一样作为一个整体立即执行。比stride-full风格更据cache-friendly。

3、基于分区的SIMD

上述实验说明,在单线程和多线程环境中,SIMD寄存器可以实验GATHER操作访问非连续内存中的元素,可达到LOAD指令访问连续内存的性能。然而,GAHTER指令需要合适的访问模式以达到他的峰值。根据上述评估,跨步访问模式的变种stride-block满足下面属性P1和P2

P1:输入数据逻辑分区成block大小,每个block大小:

d3735da1ea7f672442a11368be831dc3.png

其中k是根据数据类型不同的SIMD寄存器通道数,比如一个128位的矢量寄存器可以分成8个16位的数据通道。

g>=1,作为页gap系数。pagesize 由操作系统决定,通常4kb。

P2:对逻辑块进行连续处理,每个块内采用的访问模式是以字节为步幅的跨步访问模式。

23cca777b5c688d678ad3c795a2794d1.png

block-strided访问模式如下图所示:

SIMD的通道数k为4,因此输入数据逻辑分块内由4页,gap因子g为1。如果g>1,则一个block由g*k个连续的页组成,一个通道负责g个页。也就是说g定义了两个被访问的页面之间的间隙,每个块内页面使用步幅为g的跨步访问模式。

ae528f71034e763c45e22f49e387a54c.png

这种访问模式支持一种细粒度、页面分区的SIMD处理概念。我们基于分区的SIMD处理概念通过访问模式和分区隐式地对数据进行分区,页面分配给SIMD通道。SIMD通道操作他们本地的页面。

理解:相当于将一大串输入数据逻辑分块,每个块内分配g*k个页。g>1,比如是2,则块内使用gather指令进行跨步为2的步幅进行访问。迭代1次,并发访问k个页;头指针移访问完,动一页,迭代2次并发访问后续的页。这种方式有什么用呢?也就是对于GAHTER的应用来说,能适用这种方式?过滤后的数据进行转储,步长不固定,貌似用不到这种固定步长的方式。

4、应用案例

4.1 向量化查询处理

一个基于分区的SIMD方式的应用场景是基于列存的向量化查询。每个查询算子迭代处理多个值的向量。优势是良好的指令缓存和CPU利用率,同时保持较低的物化代价。然而,选择一个合适向量大小并不是一个简单的事情。较小的向量会提高数据cache利用率但会增加指令cache misses。大的向量会增加物化代价并损耗数据cache利用率。因此,我们基于分区的SIMD处理概念旨在显式地缓存当前和未来处理多个页面所需的数据,与线性访问相比,可以提高该处理模型的性能。

对满足列B上的谓词条件的记录,在列A上进行聚合sum操作。实现了必要算子:filter和AggSum。Filter算子首先将谓词值广播到SIMD寄存器,然后每个迭代filter将列B的数据加载到SIMD寄存器,并与谓词向量寄存器进行比较。加载操作要么使用LOAD指令(线性访问模式),要么使用GATHER指令(block-stried访问模式)。AVX2和AVX512支持cmp的向量寄存器操作。结果转换成一个bitmask,减小物化代价。第n位是1,表示SIMD寄存器种的第n个元素满足filter条件。在bitmask旁边不会存储任何额外的位置信息,所以使用这个bitmask的操作符必须隐式地解码特定的信息。当使用AVX512时,转换时动态完成的。高效的AVX2实现更具挑战性。

AVX2种使用_mm256_cmpeq_epi32比较2个SIMD寄存器(包含32位整数),并产生相同大小的SIMD寄存器值。相等对应的位位1,否则位0。使用_mm256_castsi256_ps将上面的结果转换成bitmask值。使用_mm256_movemask_pd将每64位元素种最高位包装在一个word中。虽然这个过程看起来很昂贵,但我们的实验表明,由此内存减少了32倍,步长了内存绑定算法的额外计算成本。

AggSum算子首次调用时,将一个结果的SIMD寄存器初始化0。处理了一个完整的向量后,操作符返回这个SIMD寄存器。然后将相同的寄存器用作每个后续调用的输入,并在每个处理的向量中进行修改。处理完所有数据时,sum值汇总到SIMD寄存器中并返回。对于每个向量,AggSum算子将列A的相关数据传输到一个SIMD寄存器中,并从上一个操作符中加载位置等下的bitmask。

需要注意,数据传输方法必须与前一个操作符相同。虽然AVX512原生支持mask,但是我们需要自己为AVX2创建一个特殊的mask SIMD寄存器,并使用它来零化无效数据。这个SIMD寄存器包含的所有位设置0或者1.因此可以将掩码先广播到SIMD寄存器,由lane-id和二进制与移位。这样,SIMD寄存器的每个通道包含对应位1的或者0的值。SIMD寄存器中的所有元素都减少了1,其中−1等于设置为1的所有位。最后,所得到的SIMD寄存器取反,并与数据SIMD寄存器进行与操作。

评估中,针对3个维度:1)过滤的选择率;2)向量大小;3)页gap因子。单线程评估结果1)1024向量大小(AVX2使用unint32_t);2)2084向量大小(AVX512,uint64_t)。由于我们实现了AggSum分支,所以总体查询吞吐量取决于过滤的选择性。该分支检查过滤的bitmask结果,因为AggSum操作仅针对满足条件的值。如果bitmask都是0,则给跳过该组值。根据评估结果他认为基于分区的SIMD处理概念可以高效应用到向量化处理模型中。

理解:仅将基于分区的处理应用在加载上,感觉没啥实际可用的价值。如果能够针对索引的Gather应用加载,则可以灵活处理过滤后的数据,这样才会更加有意义。

参考

2022:https://link.springer.com/article/10.1007/s13222-022-00431-0

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

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

相关文章

Sentieon | 每周文献-Benchmark and Method Study(基准与方法研究)-第八期

基准与方法研究系列文章-1 标题(英文): Standardized Comparison of Different DNA Sequencing Platforms 标题(中文): 不同 DNA 测序平台的标准化比较 发表期刊: Clinical Chemistry 作者单…

leetCode刷题记录1

文章目录 hot100题200. 岛屿数量206. 反转链表207. 课程表208. 实现 Trie (前缀树)★ Student[] strArr new Student[26];//真的只是创建了引用数组 只是new了数组存放引用的内存 并没有真的new对象内存 215. 数组中的第K个最大元素221. 最大正方形226. 翻转二叉树234. 回文链表…

Java定时算法实现与应用(最小堆、时间轮)

文章目录 一、定时算法 概述二、最小堆算法1、概述2、Java实现最小堆算法(1)Timer使用(2)源码分析 3、应用 三、 时间轮算法1、概述2、Java实现时间轮算法 一、定时算法 概述 系统或者项目中难免会遇到各种需要自动去执行的任务&…

免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 bbc

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端…

视频音频怎么提取成MP3?教你几种简单提取方法

提取视频音频并将其转换为MP3格式有很多好处。首先,MP3格式是一种广泛支持的音频格式,可以在几乎所有设备上播放,包括计算机、手机和音乐播放器。这意味着您可以在任何设备上随时随地享受音频内容,而不必担心格式兼容性问题。那么…

Win11中使用pip或者Cython报错 —— error: Microsoft Visual C++ 14.0 is required.

第一步:下载Visual Studio 2019 下载地址: https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes 第二步:安装组件 选择单个组件,勾选以下两个组件 其他错误: 无法打开文件“python37.li…

触控触感方案原厂18按键触摸芯片电路图

VK3618I具有18个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较 高的集成度,仅需极少的外部组件便可实现触摸按键的检测。 提供了2组I2C输出功能,1个INT中断输出脚,2组I2C脚和INT可并联,每组单键输出…

【腾讯云 Cloud Studio 实战训练营】快速构建React完成点餐H5页面

一,前言 1.1 相关链接 官网地址:Cloud Studio 官方文档地址:Cloud Studio(云端 IDE)简介 | Cloud Studio 1.2 Cloud Studio(云端 IDE)简介 Cloud Studio 是基于浏览器的集成式开发环境&#…

山景DSP芯片可烧录AP8224C2音频处理器方案

AP8224C2高性能32位音频应用处理器AP82系列音频处理器是面向音频应用领域设计的新一代SoC平台产品,适用于传统音响系统、新兴的蓝牙或Wifi 无线音频产品、Sound Bar 和调音台等市场。该处理器在总体架构和系统组成上,充分考虑了音频领域的特点&#xff0…

一个月学通Python(三十四):使用Selenium模拟人工操作及获取网页内容

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教…

【cs61b】学习笔记day2

历史文章目录 【cs61b】学习笔记day1 文章目录 历史文章目录List两个小问题bits声明一个变量引用类型方框和指针表示法数组的实例化链表 SLList List 两个小问题 思考下面两个代码分别输出什么 Walrus a new Walrus(1000, 8.3); Walrus b; b a; b.weight 5; System.out.…

并发编程面试题1

并发编程面试题1 一、原子性高频问题: 1.1 Java中如何实现线程安全? 多线程操作共享数据出现的问题。 锁: 悲观锁:synchronized,lock乐观锁:CAS 可以根据业务情况,选择ThreadLocal,让每个…

2023最新版Anaconda下载安装教程(非常详细)从零基础入门到精通,看完这一篇就够了

1. 前言 小编的电脑是win10系统的,这里以win10系统安装Anaconda为例,其他的系统安装过程类似,可以照猫画虎,下面请看具体的安装过程。 2. 下载软件 1、首先去官网上进行下载软件,下载地址: https://docs…

php获取随机订单号(封装函数)

作为一个开发人员,生成订单时常常需要获取一段随机码来表示订单号,并且订单号一般包含的特定的时间日期等信息,临时现写一个比较浪费时间,这里有一个封装好的生成随机订单号的函数,需要时直接调用即可。 代码如下&…

【腾讯云 Cloud Studio 实战训练营】一个新的趋势已来

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

Datahub稳定版本0.10.4安装指南(独孤风版本)

大家好,我是独孤风,大数据流动的作者。 曾几何时,我在第一次安装JDK环境的时候也遇到了不小的麻烦,当时还有朋友就因为这个环境问题觉得自己根本不是编程的料,选择了放弃。当时有个段子说,“如果不是JDK环境…

生物学家呼吁:基因组测序是从大流行病中快速获得信息的最重要方法之一

生物学家Jason Ladner和Jason Sahl于2023年8月1日发表在《PLOS Biology》(IF20229.8)的一篇文章中主张,持续发展基因组测序是能从大流行病中快速获得信息的最重要方法之一。基因组测序对全球应对COVID-19产生了巨大影响,随着更多研…

与这个夏天的快乐与不快乐,都挥手告别吧!

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 伊姐 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 2023这个夏天, 地震、暴热、洪水……呼的一下, 密集发生的天灾让人揪心&#xff0c…

Unity-Shader-高亮Highlight

常用Shader-高亮,可动态调整高亮颜色、高亮强度范围/等级、高亮闪烁速度、高亮状态 Shader "CustomShader/Highlight" {Properties{_Color("Color", Color) (0.9044118,0.6640914,0.03325041,0)_Albedo("Albedo", 2D) "white…

vue自定义密码输入框解决浏览器自动填充密码的问题

浏览器对于type"password"的输入框会自动填充密码,但有时出于安全或者其他原因,我们不希望浏览器记住并自动填充密码。通过网上查到的一些解决方案,可以总结出以下几种解决方案(主要用edge浏览器进行测试): 通过autoco…