聊聊Doris向量化执行引擎-过滤操作

news2025/1/16 3:00:23

聊聊Doris向量化执行引擎-过滤操作

Doris是开源的新一代极速MPP数据库,和StarRocks同源,采用全面向量化技术,充分利用CPU单核资源,将单核执行性能做到极致。本文,我们聊聊过滤操作是如何利用SIMD指令进行向量化操作。

过滤操作的SIMD向量化函数是_evaluate_vectorization_predicate:和StarRocks实现大致类似,但稍有不同:

  SegmentIterator::_evaluate_vectorization_predicate

执行过程如下图所示:

f5421203f20354d8b5f70df070bfd624.png

1、通过1个字节bool类型的ret_flags数组来表示是否满足过滤条件,1表示满足条件,0表示不满足

2、AVX2指令集环境下:通过_mm256_loadu_si256封装的指令函数加载256位长度值到寄存器,也就是32字节值f

3、_mm256_setzero_si256生成256位的0值all0

4、_mm256_cmpgt_epi8函数将f和all0每个字节进行并行比较,也就是32个字节并行比较,f中字节>all0中字节值时,对应结果位为1,否则为0

5、将第4步的值通过_mm256_movemask_epi8转换成int整数mask。比如10001111111111111,转换后为36863,其中ret_flags[0]为1,ret_flags[1]为0...

6、mask等于0,表示没有一个满足条件。

7、mask等于0xffffffff,表示全部满足条件,需要将32个数据的行号保存到数组sel_rowid_idx[]中

8、mask等于其他值时,表示有一部分值满足条件。这个时候需要特殊处理:

1)通过__builtin_ctzll(mask)计算mask中末尾0的个数bit_pos。比如:

11100000:有5个0

2)sel_rowid_idx[new_size++] = sel_pos + bit_pos;后导第一个满足条件的行号保存到sel_rowid_idx数组中

3)mask = mask & (mask - 1)跳过不满足的行,StarRocks实现方式:mask右移6位,即11,值3。

4)当然还需要处理尾数据,也就是SIMD对其后剩余的部分:按照标量处理方式处理

for (; sel_pos < sel_end; sel_pos++) {
    if (ret_flags[sel_pos]) {
        sel_rowid_idx[new_size++] = sel_pos;
    }
}

5)返回1)步继续计算。

9、当然,上述涉及mask的计算,仅说明了AVX指令集下实现方式,同时还实现了SSE2指令集

inline uint32_t bytes32_mask_to_bits32_mask(const uint8_t* data) {
#ifdef __AVX2__
    auto zero32 = _mm256_setzero_si256();
    uint32_t mask = static_cast<uint32_t>(_mm256_movemask_epi8(
            _mm256_cmpgt_epi8(_mm256_loadu_si256(reinterpret_cast<const __m256i*>(data)), zero32)));
#elif defined(__SSE2__) || defined(__aarch64__)
    auto zero16 = _mm_setzero_si128();
    uint32_t mask =
            (static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpgt_epi8(
                    _mm_loadu_si128(reinterpret_cast<const __m128i*>(data)), zero16)))) |
            ((static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpgt_epi8(
                      _mm_loadu_si128(reinterpret_cast<const __m128i*>(data + 16)), zero16)))
              << 16) &
             0xffff0000);
#else
    uint32_t mask = 0;
    for (std::size_t i = 0; i < 32; ++i) {
        mask |= static_cast<uint32_t>(1 == *(data + i)) << i;
    }
#endif
    return mask;
}

关键原理同样是将32字节的select数组,转变成32bit位的无符号整数来操作

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

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

相关文章

PCB设计流程步骤中的注意事项

PCB中文名称为印制电路板&#xff0c;又称印刷线路板&#xff0c;几乎所有电子设备中都会应用到PCB。这种由贵金属制成的绿色电路板连接了设备的所有电气组件&#xff0c;并使其能够正常运行。PCB原理图是一个计划&#xff0c;是一个蓝图。它说明的并不是组件将专门放置在何处&…

【51单片机HC6800-EM3 V3.0】动态数码管显示,原理分析,连线操作

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f354;提醒 &#x1f38a;连线图片 &#x1f38a;原理…

基于SSM框架扶贫信息综合平台前台管理系统(spring+springmvc+mybatis+jsp+jquery+css)

一、项目简介 本项目是一套基于SSM框架扶贫信息综合平台前台管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…

【刷题】138. 复制带随机指针的链表

138. 复制带随机指针的链表 一、题目描述二、示例三、实现 138. 复制带随机指针的链表 一、题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝…

Matlab论文插图绘制模板第90期—带权重的有向图/图论图/网络图

在之前的文章中&#xff0c;分享了Matlab有向图的绘制模板&#xff1a; 进一步&#xff0c;如果我们想标注有向图的每条边的权重&#xff0c;或者直接用线条的粗细来表示权重&#xff0c;该怎么操作呢&#xff1f; 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内…

洛谷P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II(离线区间逆序对+莫队二次离线)

题目 给你一个长为n(1<n<1e5)的序列a(0<ai<1e9)&#xff0c; m(1<m<1e5)次询问&#xff0c;每次查询一个区间[l,r]的逆序对数&#xff0c;可离线。 思路来源 登录 - 洛谷 三道经典分块题的更优复杂度解法&[Ynoi2019模拟赛]题解 - 博客 - OldDriverT…

(异或相消)猫猫数字异或和

E - Red Scarf (atcoder.jp) 刚入坑写的一道题被我拉出来对比分析了 我的思路&#xff1a; 垃圾运气选手凭借直觉乱搞猜出来的&#xff0c;没有思路。 题解思路&#xff1a; 由问题陈述中XOR的定义&#xff0c;我们可以看出计算3个或更多整数的XOR可以以任意顺序进行&#…

fastjson 代码执行 (CNVD-2017-02833)

漏洞存在原因 在fastjson<1.2.24版本中&#xff0c;在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。而在1.24<fastjson<1.2.48版本中后增加了反序列化白名单。 漏洞复现过程如下 在vulfocu…

解读ChatGPT中的RLHF

无论是 ChatGPT 还是 GPT-4&#xff0c;它们的核心技术机制之一都是基于人类反馈的强化学习&#xff08;Reinforcement Learning from Human Feedback&#xff0c;RLHF&#xff09;。这是大型语言模型生成领域的新训练范式&#xff0c;即以强化学习方式依据人类反馈优化语言模型…

打造属于自己的私人云笔记

打造属于自己的私人云笔记 前言效果环境标题第一步 网盘部署开启webDAV协议使用 前言 现在市面上支持私有化部署的云笔记选择不多&#xff0c;而且大多数只支持mackDown语法&#xff0c;不支持word等其他文件的编辑&#xff0c;基于此需求&#xff0c;能不能有一款笔记软件&am…

盛元广通高等级生物安全实验室(P3)管理系统

近年来&#xff0c;传染性疾病频发&#xff0c;给传染病防控和生物安全带来了前所未有的挑战&#xff0c;重点构建集生物安全三级实验室&#xff0c;统一布局科技研究和科技力量&#xff0c;成为重要传染病原和生物防范基础及应用基础研究的高地&#xff0c;高等级生物安全实验…

JavaScript实现输入长方形的宽和高,输出周长和面积的代码

以下为实现输入长方形的宽和高&#xff0c;输出周长和面积的代码和运行截图 目录 前言 一、实现输入长方形的宽和高&#xff0c;输出周长和面积 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 输入数值不是要求必须输入数值的代码 1.5 运行截图 前言 1.若…

这款视频录制剪辑软件千万别错过!

案例&#xff1a;有没有录制完成之后&#xff0c;可以直接剪辑视频的软件&#xff1f; 【我的工作经常需要对电脑上的内容进行录制、剪辑。我每次都需要使用录屏工具录制完成后&#xff0c;再使用视频剪辑工具进行剪辑&#xff0c;十分麻烦。想问一下有没有软件既能录屏又能剪…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(一)(共识网络分析-第一步-数据整理)

1写在前面 最近又是忙碌的一米&#xff0c;做不完的手术&#xff0c;收不完的病人&#xff0c;前途堪忧&#xff0c;收入更是不堪入目。&#x1f972; 把之前的WGCNA教程再补一补吧&#xff0c;之前介绍的是雌性鼠的表型数据分析&#xff0c;只有一组&#xff0c;相对简单。&am…

elk生命周期删除日志

elk版本&#xff1a;7.14 一、简介 ELK日志我们一般都是按天存储&#xff0c;例如索引名为"prodlog-2023-05-08"&#xff0c;因为日志量所占的存储是非常大的&#xff0c;我们不能一直保存&#xff0c;而是要定期清理旧的&#xff0c;这里就以保留7天日志为例。 自…

Android开发 LogDog (日志狗)V1.2.0

目录 一、简介 二、添加LogDog 1、添加仓库 2、添加依赖 三、V1.2.0 更新和新的使用方式 1、初始化和配置 2、配置的新使用 3、使用和打印更新说明 4、更新说明 一、简介 具体日志简介可以去看1.0.2版本的简介 LogDog 简介https://blog.csdn.net/Ym_quiet/article/d…

【多任务学习】Multi-task Learning 手把手编码带数据集, 一文吃透多任务学习

文章目录 前言1.多任务学习1.1 定义1.2 原理 2. 多任务学习code2.1 数据集初探2.2 预处理2.3 网络结构2.4 训练 3. 总结 前言 我们之前讲过的模型通常聚焦单个任务,比如预测图片的类别等,在训练的时候,我们会关注某一个特定指标的优化. 但是有时候,我们需要知道一个图片,从它身…

Windows远程执行进程工具psexec和wmiexec介绍

在自动化测试或者自动化工具开发中&#xff0c;通常需要向其它电脑或者服务器发送指令&#xff0c;比如Windows发送命令到Linux服务器开启某个服务进程&#xff0c;或者读取状态信息&#xff0c;我们可以使用ssh协议实现。 如果Windows主机需要发送命令到局域网内的其它Window…

第四十五章 Unity 滚动视图 (Scroll View) UI

我们介绍一下滚动条 (Scrollbar)&#xff0c;它允许用户滚动由于太大而无法完全看到的图像或其他视图。这种效果在我们网页中经常看到&#xff0c;尤其是网页内容太长的时候&#xff0c;就会在垂直方向出现滚动条。当然&#xff0c;有时候也会在水平方向出现滚动条。我们拖动滚…

WebRTC引用计数和线程

1. 什么是引用计数&#xff1a; 引用计数是计算机编程语言中的一种内存管理技术&#xff0c;是指将资源&#xff08;可以是对象、内存、或磁盘空间等等&#xff09;的被引用次数保存起来&#xff0c;当被引用次数变为零时就将其释放的过程。 使用引用计数技术可以实现自动资源…