《2-5 ClickHouse 向量化执行与 Pipeline 设计.pdf》由会员分享,可在线阅读,更多相关《2-5 ClickHouse 向量化执行与 Pipeline 设计.pdf(54页珍藏版)》请在三个皮匠报告上搜索。
1、ClickHouse向量化执行与Pipeline设计冯吕 ClickHouse社区贡献者About Me ClickHouse Top 50 Contributor,100+merged PRs https:/ MS student at Institute of Computing Technology,CAS Internship at Tencent WeChat Working on ClickHouse development0101ClickHouse简介目录CONTENTCONTENT02向量化执行03Pipeline设计与实现04总结ClickHouse简介01ClickHou
2、se是什么 一个高效的OLAP数据库 最早由Yandex公司开源(2016年)现已从Yandex独立出去ClickHouse,Inc.ClickHouse是什么 工程艺术品 现有技术的充分运用 极致性能优化 Substring search:从几十种算法中选择出最合适的一种 Aggregation:不同数据类型使用不同的Hash表 核心特性:True Column-Oriented Storage Vectorized Query ExecutionClickHouse核心特性 基于MergeTree(类似LSM Tree)的列式存储?列式存储 其他列式存储 VS ClickHouse列式存储
3、?ClickHouse核心特性 向量化执行:以行(Row)为单位-以Block为单位,按列对数据进行处理?向量化执行02什么是向量化 对不同的数据执行同样的一个或一批指令,或者说把指令应用于一个数组/向量,通过CPU数据并行,即SIMD 通俗地说,对一个数组进行连续操作,即可看做向量化?向量计算 VS 常量计算 从CPU流水线角度来看,向量化能够充分填满CPU计算单元?什么是向量化 向量化的本质是采用一个控制器来控制多个处理器,同时对一组数据中的每一条执行相同操作,实现空间上的并行 单指令流:同时只能执行一种操作 多数据流:在一组同构(向量)的数据上进行操作?硬件支持 Intel CPU提供了
4、一系列SSE,AVX扩展向量化指令集?SIMD缺陷 不适用于严重依赖控制流的任务,即有大量分支、跳转和条件判断的语句 主要被用来优化可并行计算的简单场景,以及可能被频繁调用的基础逻辑 不能以不同的方式处理不同的数据?如何实现向量化 自动向量化和Intrinsic函数在通用性和易用性方面更强?Intrinsic函数实现向量化 使用SSE _mm_add_ps intrinsic函数,一次实现8个单精度浮点数的加法?编译器自动向量化 clang+-O3,自动使用向量化指令?ClickHouse向量化 Intrinsic函数 大量使用intrinsic函数对关键路径代码进行优化 编译器自动向量化 通
5、过良好的架构设计和代码设计,使得编译器能够生成良好的向量化代码 关键:基于Pipeline的执行引擎设计,能够按列对数据进行处理ClickHouse中的intrinsic函数 https:/ memcmpSmall.h ColumnsCommon.h/cpp AggragationCommon.h ColumnsHashing.hIPv6ToBinary.cpp remapExecutable.cpp StringSearcher.h FunctionsHashing.h randomString.h randomFixedString.h TargetSpecific.cpp generat
6、eUUIDv4.cpp greateCircleDistance.cpp UTF8Helpers.h/cpp divice.cpp divideImpl.cpp FunctionRando.h/cpp.FunctionsRound.h isValidUTF8.cpp LowerUpperImpl.hmodule.cpp Column Filter 将64字节压缩成64位的数,通过pop_count指令进行计算?Column Filter?ClickHouse-编译器自动向量化 关键:基于Pipeline的执行引擎 以Block为单位,按列对数据进行处理 优化:代码设计中大量使用模板(templ