论文研读-SIMD系列-利用BMI指令进行选择下推

news2025/1/21 18:42:11

利用位操作指令BMI在列存中进行选择下推

Selection Pushdown in Column Stores using Bit Manipulation Instructions

列存能够提供高效的压缩能力,所以当前分析型数据库系统都基于列存储。然而,查询处理时,压缩会面临解码速率的挑战。以往研究探索了编码列上进行谓词下推,以避免解码,但这些技术仅限于特定的编码schemes和谓词,限制了实际应用。本文提出一种通用谓词下推方法,支持任意谓词,利用选择下推减少解码代价。我们方法的核心是一个快速选择操作符,能够使用位操作指令BMI(X86体系架构的指令扩展集)直接提取选定的编码值而无需解码。使用TPCH和micro-benchmark在Parquet上进行测试,结果显示针对代表性的扫描查询,我们的技术能够提高一个数量级。使用Spark进一步实现表明,即使对于涉及复杂join的端到端查询,速度也可以提高5.5倍。

其实他这里的下推指:多个谓词时,将前面谓词的过滤结果下推到后面一个谓词中,仅针对前面谓词满足条件的值先decoding然后进行后面谓词计算。话说,现在数据库的多谓词计算不都是这样吗?至少对于PgSQL和GPDB数据库是这样处理的。

该论文的价值在于通过BMI指令将过滤后的结果并行拷贝到结果寄存器中。Doris、Clickhouse、OceanBase等数据库都是通过SIMD指令并行进行谓词计算后,利用bitmap来标记哪些值符合条件,从而依次将满足条件的值拷贝到结果缓存中。这就是该论文的优势。

话不多说,我们看下该论文。

1、什么是BMI指令

BMI指令集是X86指令集架构的扩展,为了提高位操作的性能。所有的指令都是非SIMD的,在通用寄存器中进行操作。文中主要用到了PEXT(parallel bit extract)和PDEP指令。

1)PEXT:格式:PEXT r32a, r32b, r/m32。PEXT根据r/m32中指定的掩码将r32b中的比特位传输到r32a的低比特位中。

50d8168b02dc5996bb3a135d2966d962.png

PEXT:其实是根据掩码将源寄存器值存入目标寄存器。源寄存器的高位放到目标寄存器的低位。目前寄存器连续存放。源寄存器根据mask值分散取值。

2)PDEP :格式:PDEP r32a, r32b, r/m32,使用r/m32的掩码,将r32b中的低比特位传输并散列到r32a中:

c250e9c32d9535ac25b652e3370707c9.png

PDEP:其实是根据掩码将源寄存器值存入目标寄存器。源寄存器的高位放到目标寄存器的低位。源寄存器值连续取,根据mask,将连续值分散存入目标寄存器。当然,也是将源寄存器高位存入目标寄存器低位。

指令的使用参考:

https://www.intel.com/content/www/us/en/docs/cpp-compiler/developer-guide-reference/2021-9/pext-u32-64.html

4、BIT-PARALLEL SELECT算子

SELECT算子将一个字节数组(由k位的值组成)和一个n位的选择bitmap作为输入。将选择bitmap中位为1的对应值提取出来,并拷贝到连续位的输出字节数组中,也就是输出字节数组仅包含满足条件的值,并且连续。

一个明显的解决方案:扫描所有bit-packed值,并一次提取出一个被选择的值。考虑到,每个值通常仅有几位,比处理器word(比如64位)要小,这样简单处理并不能充分利用处理器word的宽度,因此浪费了处理器可用的并行性。

因此本文的目标就是设计一个bit-parallel的选择算子。这就是说,该算子可同时处理被打包到一个处理器字中的所有值,并将所选定的值并行地移动到合适的位置。

因此,给定一个word的大小为w,处理n个k位值的指令复杂度位O(nk/w)。

4.1 简化的算法

2a0aa3e79efa78f3ae29dadf2cc3e7e1.png

图3的例子:从8个4位值选择3个值。通过不同背景色区分不同值。该算法分为2步。1)将输入的选择bitmap:11000100扩展转成成1111 1111 0000 0000 0000 1111 0000 0000。2)这样就可以使用PEXT指令将所有选择的bits拷贝到输出中了。

首先,设计了一个优雅的方式仅使用3个指令(两个PDEP和一个减法)就可以将一个bitmap转换位扩展的bitmap。扩展bitmap的方法:1)mask:0k1...0k1(该案例中mask为0001,即4-1个0和1个1);2)通过PDEP指令将1100 0100通过mask值分散到目标寄存器中,得到low值;3)mask-1,即0001 0001 0001 0001 0001 0001 0001 0000,再将bitmap通过该值进行分散,得到hight值:

488a321587a878be6979c29f011e39dc.png

4)high - low得到扩展的bitmap。最后利用扩展的bitmap通过PEXT指令即可从values中并行选出值。

4.2 通用算法

4.1中的案例仅针对一个字节能正好能放满值的例子,即值位数为2的倍数,也就是值不会有跨边界的情况。这一节介绍,如果跨边界怎么办。

4a851e1fc10dd084d86a6aba79c3d3bd.png

1)需要移动mask进行字节对齐。图4中,word 2中mask左移两位,因为v21的部分值还有两位。同样,word 1左移一位,v10的部分值有1位。

2)mask中的最小位必须是1,即使对应于一个值的中间位。最右边的1确保了减法指令能够扩展位图中的部分值生成1的序列。

这样就能保证扩展位的正确生成。

5、论文

2023 ACM SIGMOD Conference:

https://www.microsoft.com/en-us/research/publication/selection-pushdown-in-column-stores-using-bit-manipulation-instructions/

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

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

相关文章

亚马逊产品流量上不去怎么办?亚马逊产品流量入口有哪些?

众所周知流量对于跨境卖家们是很重要的,这影响了你产品的曝光度和转化率,那么如果亚马逊产品流量上不去怎么办,亚马逊产品流量入口有哪些? 亚马逊产品流量上不去怎么办? 1、优化产品标题和关键词 产品标题和关键词是…

mojo初体验

目录标题 mojo初体验试用地址变量定义参数可变性和所有权Structures后续 mojo初体验 试用地址 https://www.modular.com/get-started 与python基础语法很相似。 变量定义 let定义不可变变量var定义可变变量 参数可变性和所有权 下面是一个基本的函数: fn add…

第一章 计算机概述

1.冯诺依曼结构: 计算机由运算器、控制器、存储器、输入设备、输出设备五大部件组成 运算器和控制器称为CPU;CPU和存储器称为计算机主机;其余输入、输出设备、外存储器称为计算机外部设备采用二进制表示数据和指令 指令由操作码(…

AJAX学习笔记1发送Get请求

传统请求有哪些方式,及缺点 传统请求有哪些? 1.直接在浏览器地址栏上输入URL. 2.点击超连接. <a href"/上下文/请求地址">超链接请求</a> ---->相对路径 <a href"http://www.baidu.com">超链接请求</a> ---->绝对路…

【Java 基础篇】Java StringBuffer详解:更高效的字符串处理

在Java编程中&#xff0c;字符串是一个常见的数据类型&#xff0c;用于存储文本信息。然而&#xff0c;与字符串相关的操作可能会导致性能问题&#xff0c;因为字符串是不可变的&#xff0c;每次对字符串进行操作都会创建一个新的字符串对象。为了解决这个问题&#xff0c;Java…

Windows命令行初步:更改配色、提示符以及编码方式

文章目录 启动和退出窗口标题和提示符命令行颜色更改编码 启动和退出 按下winR&#xff0c;调出运行窗口&#xff0c;输入cmd就可以进入命令行了。在Win10以前的系统种&#xff0c;如果在命令行中再输入一个cmd&#xff0c;就会再打开一个命令行。但最近的Win11版本中&#xf…

[管理与领导-66]:IT基层管理者 - 辅助技能 - 4- 乌卡时代(VUCA )的团队管理思维方式的转变

目录 一、乌卡时代人与公司的关系的转变 二、乌卡时代管理方式的转变 三、乌卡时代的管理与传统时代的管理比较 四、乌卡时代管理者的挑战 五、乌卡时代如何做好管理 六、个人能力要求 一、乌卡时代人与公司的关系的转变 在乌卡时代&#xff08;指虚拟办公、远程工作等数…

实景三维数字孪生系统(实景三维电子沙盘)

一、概况 实景三维数字孪生系统是一种基于虚拟现实技术的系统&#xff0c;紧紧围绕应急处置的核心业务&#xff0c;通过将真实世界的物体、场景和过程数字化&#xff0c;创建出一个与真实世界相对应的虚拟模型。它可以模拟真实世界中的各种情境和操作&#xff0c;使用户能够在虚…

PYTHON知识点学习-函数调用中returnprint

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是Aileen★。希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由 Aileen_0v0★ 原创 CSDN首发&#x1f412; 如需转载还请通知⚠ &am…

1779_树莓派小车电机驱动软件实现

全部学习汇总&#xff1a; GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 前几天看了树莓派小车实现的硬件相关部件梳理视频&#xff0c;今天看了一段树莓派小车的电机驱动软件实现。 视频非常短&#xff0c;从里面能够提取出来的我感…

图上简单路径问题——转化为圆方树问题:abc318_g

https://atcoder.jp/contests/abc318/tasks/abc318_g 对原图建圆方树后&#xff0c;任意两点间的简单路径必然为其树上路径上方点对应其边双的点。 然后判断A&#xff0c;C路径上的方点是否会有B 圆方树&#xff1a; void dfs(int x) {dfn[x]low[x]tot; z.push(x); for(int …

【C++】学习STL中的list

❤️前言 大家好&#xff01;&#xff0c;今天为大家带来的一篇博客是关于STL中的list&#xff0c;内容主要包括list的介绍使用、list的模拟实现。以及list与vector的对比。 正文 list的介绍和使用 首先&#xff0c;让我们看看list的文档介绍&#xff1a; list是可以在常数范…

【C++深入浅出】类和对象上篇(类的基础、类的模型以及this指针)

目录 一. 前言 二. 面向对象与面向过程 2.1 面向过程 2.2 面向对象 三. 类的基础知识 3.1 类的引入 3.2 类的定义 3.3 成员变量的命名规则 3.4 封装 3.5 类的访问限定符 3.6 类的作用域 3.7 类的实例化 四. 类的对象模型 4.1 类对象的大小 4.2 类对象的存储方式 …

红队打靶:Narak打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现与端口扫描 第二步&#xff1a;Web渗透 第三步&#xff1a;tftp渗透 第四步&#xff1a;webdav利用 第五步&#xff1a;寻找敏感文件初步提权 第六步&#xff1a;motd利用提权 总结与思考 写在开头 本篇博客在自己的理解之上…

Windows下Redis的安装和配置

文章目录 一,Redis介绍二,Redis下载三,Redis安装-解压四,Redis配置五,Redis启动和关闭(通过terminal操作)六,Redis连接七,Redis使用 一,Redis介绍 远程字典服务,一个开源的,键值对形式的在线服务框架,值支持多数据结构,本文介绍windows下Redis的安装,配置相关,官网默认下载的是…

yo!这里是c++中的继承

目录 前言 概念定义 基类与派生类对象转换 作用域 派生类的默认成员函数 与友元&&与静态成员 菱形继承及菱形虚拟继承 多继承 菱形继承 虚拟继承 1.介绍 2.原理 继承总结 后记 前言 封装、继承、多态作为c的三大特性&#xff0c;在学完封装的有关内容之后…

OAuth2.0二 JWT以及Oauth2实现SSO

一 JWT 1.1 什么是JWT JSON Web Token&#xff08;JWT&#xff09;是一个开放的行业标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种简介的、自包含的协议格式&#xff0c;用于在通信双方传递json对象&#xff0c;传递的信息经过数字签名可以被验证和信任。JW…

python借助isinstance(item, (int, float))提取列表中的数字

如下一个列表[1,2,3,23, ,123] 借助isinstance(item, (int, float)) List [1,2,3,23, ,123] numbers [] # 遍历原始列表 for item in List:# 检查每个元素是否为数字&#xff08;整数或浮点数&#xff09;if isinstance(item, (int, float)):# 如果是数字&#xff0c;则添加…

Eclipse的安装(NEW~)

艾米&#xff0c;我擅长做很多事&#xff0c;但忘记你你并非其中一件。 随着IntelliJ IDEA在Java开发领域越来越广泛的被使用&#xff0c;Eclipse似乎快要退出舞台了。不过作为一款开源免费并拥有悠久历史的Java 开发IDE&#xff0c;总会有一批铁粉支持它&#xff0c;惦记着它。…

Ubuntu 20.04 LTS 安装Kubernetes 1.26

1、环境配置 (1)添加主机名称解析记录 cat > /etc/hosts << EOF 192.168.44.200 master01 master01.bypass.cn 192.168.44.201 node01 node01.bypass.cn 192.168.44.202 node02 node02.bypass.cn EOF(2)禁止K8s使用虚拟内存 swapoff -a sed -ri s(.*swap.*)#\1…