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

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

聊聊Doris向量化执行引擎-过滤操作Doris是开源的新一代极速MPP数据库,和StarRocks同源,采用全面向量化技术,充分利用CPU单核资源,将单核执行性能做到极致。本文,我们聊聊过滤操作是如何利用SIMD指令进行向量化操作。过滤操作的SIMD向量化函数是_evaluate_vectorization_predicate:和StarRocks实现大致类似,但稍有不同:  SegmentIterator::_evaluate_vectorization_predicate执行过程如下图所示:

1、通过1个字节bool类型的ret_flags数组来表示是否满足过滤条件,1表示满足条件,0表示不满足2、AVX2指令集环境下:通过_mm256_loadu_si256封装的指令函数加载256位长度值到寄存器,也就是32字节值f3、_mm256_setzero_si256生成256位的0值all04、_mm256_cmpgt_epi8函数将f和all0每个字节进行并行比较,也就是32个字节并行比较,f中字节>all0中字节值时,对应结果位为1,否则为05、将第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个02)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位的无符号整数来操作

      目录
      相关文章
      |
      数据可视化 Go 数据库
      WEGO使用—在线GO功能注释
      WEGO是华大基因公司的一个在线GO注释的网站,根据网站的介绍:WEGO(网络基因本体注释图)是一个简单但有用的工具,用于可视化,比较和绘制基因本体注释结果。随着围棋词汇越来越流行,WEGO在许多研究中被广泛采用和使用,最新一次的更新是在2018年。
      1501 0
      |
      JavaScript
      顶象Js的一键还原
      顶象Js的一键还原
      637 0
      |
      存储 SQL NoSQL
      Doris 架构原理及核心特性详解
      Doris 是百度内部孵化的OLAP项目,现已开源并广泛应用。它采用MPP架构、向量化执行引擎和列存储技术,提供高性能、易用性和实时数据处理能力。系统由FE(管理节点)和BE(计算与存储节点)组成,支持水平扩展和高可用性。Doris 适用于海量数据分析,尤其在电商、游戏等行业表现出色,但资源消耗较大,复杂查询优化有局限性,生态集成度有待提高。
      2372 15
      |
      存储 自然语言处理 BI
      从 Elasticsearch 到 Apache Doris 腾讯音乐内容库升级,统一搜索分析引擎,成本直降 80%
      实现写入性能提升 4 倍、使用成本节省达 80% 的显著成效
      662 1
      从 Elasticsearch 到 Apache Doris 腾讯音乐内容库升级,统一搜索分析引擎,成本直降 80%
      |
      监控 安全 物联网
      危化品行业人员定位系统解决方案:预防安全事故、提升应急响应能力
      本文旨在深入探讨危化品行业人员定位系统的最新技术革新,解决如何在高风险环境中高效、精准地监测与管理人员位置,从而预防安全事故、提升应急响应能力的问题。如需获取人员定位系统方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
      292 4
      |
      人工智能 文字识别 API
      OpenSearch & AI搜索开放平台,实现0代码图片搜索!
      本文主要介绍了如何利用阿里云的 OpenSearch 和 AI 搜索开放平台来构建一个无需编写代码就能完成的图片搜索功能。
      662 12
      |
      传感器 物联网 定位技术
      低功耗蓝牙
      低功耗蓝牙(Bluetooth Low Energy,简称BLE)是一种无线通信技术,专为低功耗应用设计。它在保持蓝牙无线连接的同时,大幅降低了能耗,适用于各种小型设备和传感器,如智能手环、健康监测器等。
      1230 2
      |
      安全 Java 开发者
      Java中常见的并发问题及解决方案
      Java中常见的并发问题及解决方案
      |
      SQL 资源调度 数据库连接
      Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南
      在Tez上优化Hive查询,包括配置参数调整、理解并行化机制以及容器管理。关键步骤包括YARN调度器配置、安全阀设置、识别性能瓶颈(如mapper/reducer任务和连接操作),理解Tez如何动态调整mapper和reducer数量。例如,`tez.grouping.max-size` 影响mapper数量,`hive.exec.reducers.bytes.per.reducer` 控制reducer数量。调整并发和容器复用参数如`hive.server2.tez.sessions.per.default.queue` 和 `tez.am.container.reuse.enabled`
      1708 0