欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

ClickHouse 向量化执行引擎与 SIMD 指令集加速原理

发表于:|最后更新:|分类:数据库与存储|阅读:2746 次

ClickHouse 等现代分析型数据库摒弃了传统的 Volcano 迭代器模型(逐行处理),改为向量化执行模型(Vectorized Execution)。数据按列以固定 Block 组织成数组,直接利用现代 CPU 的 AVX2/AVX-512 SIMD 指令并行计算。

一、基于 SIMD 优化的紧凑数据内存布局

cpp
// 典型的向量化数组连续内存分配
template <typename T>
class ColumnVector {
    // 连续内存分配保证 CPU 缓存行(Cache Line)预取最大命中率
    std::vector<T> data;
public:
    void filter_simd(const uint8_t * __restrict__ filter, size_t size) {
        // 编译器易于将以下连续循环自动向量化为 SIMD 矢量指令
        #pragma clang loop vectorize(enable)
        for (size_t i = 0; i < size; ++i) {
            if (filter[i]) {
                process(data[i]);
            }
        }
    }
};