当前位置: 首页 > news >正文

Photon Vectorized Engine 学习记录

Photon Hash Aggregation Vectorization

Photon Hash Join 的向量化的要点是:使用开放地址法。步骤:

  1. 向量化计算 hash 值
  2. 基于 hash 向量化计算 bucket 下标,得到 bucket index 向量
  3. 基于 bucket index 向量中记录的下标找到 bucket,判定是否冲突,如果冲突则继续向下,直至找到正确 bucket,将正确 bucket 下标回填到 bucket index 向量中 (Not So Vectorized)。下图中绿色就是解决冲突后找到的 bucket 位置。

在这里插入图片描述
4. 向量化计算 Aggregate 值。伪代码如下:
在这里插入图片描述
可以看到,上面几个步骤里,除了 3 里面有一些不规整的操作,其余都是非常简单的 kernel 操作。

Photon 关于 Null 的考虑

Photon 测试发现,为了处理 Null,会付出 23+% 的开销。基于如下观察:

  • 用户很少专门给列加上 Not Null 约束
  • 很多场景里虽然没有指明 Not Null 约束,但实际数据中 Null 很少

所以,Photo 给每一个 batch 的数据都附带了一个 has_nulls() 标记,如果这一批数据里面一个 null 都没有,那么这一批数据的计算就可以使用 NotNullKernel,性能最佳;反之,就回退到使用 WithNullKernel,付出必要的代价。

在这里插入图片描述
注意:这里要强调 Batch,而不是全量数据。全量数据里有少许 Null,但其中大部分 Batch 里没有 Null,就能用上上述优化。

Photon 关于 Selector / Active Rows 考虑

考虑到存在 Filter,并且 Filter 可能会过滤掉大部分数据,Photon 为过滤后的数据创建了一个 Active Rows 结构,用于索引未被过滤的数据。
增加 Active Rows 概念后,后继所有数据访问都要通过 Active Rows 索引来定位,成为框架固有开销。

另一种实现思路是引入 Skip 数组,当行过滤时,Skip[i] 被设置为 1,否则为 0。访问过滤后的数据时,需要遍历整个 skip 数组。这么做的好处是(…内存好管理?),缺点是增加了不必要的判断。

http://www.lryc.cn/news/17074.html

相关文章:

  • webRTC学习-基础知识
  • MySQL数据库——JDBC编程
  • 【面向小白】你见过这样讲解队列的吗?(阅此文可学会用纯C手撕一个队列)
  • [element plus] 对话框组件再封装使用 - vue
  • Markdown基本语法简介
  • 分布式服务的接口幂等性如何设计
  • 视频流截取保存到本地路径(打包jar包CMD运行)
  • mysql索引失效的几种情况
  • Windows下载安装Redis的详细步骤
  • 【蓝桥杯每日一题】差分算法
  • MyBatis Plus 数据库字段加密处理
  • openpose在win下环境配置
  • 【剑指offer-C++】JZ16:数值的整数次方
  • 了解Axios及其运用方式
  • 【LeetCode】剑指 Offer(7)
  • Python:try except 异常处理整理
  • Redis Lua脚本的详细介绍以及使用入门
  • synchronized和ReentrantLock有什么区别呢?
  • SVHN数据集下载及使用方法
  • 产业安全公开课:2023年DDoS攻击趋势研判与企业防护新思路
  • Docker 容器命令 和安装各种镜像环境
  • 【数据结构】顺序表的深度剖析
  • 当面试官问“你的SQL能力怎么样”时,怎么回答才不会掉进应聘陷阱?
  • AI作画—中国画之山水画
  • Java:Java与Python — 编码大战
  • 山东专精特新各地市扶持政策
  • 持续事务管理过程中的事件驱动
  • 【手把手一起学习】(三) Altium Designer 20 原理图库添加元件
  • 设计模式-行为型模式:观察者模式
  • Springboot 为了偷懒,我封装了一个自适配的数据单位转换工具类