PDX列式存储
向量数据示例
传统顺序(水平)存储
向量列式存储
向量列存
1. 水平方向(Horizontal)的流程与含义
核心思想:单条查询向量 vs. 多个数据维度(单指令多数据,SIMD)
- 适用场景:计算一条查询向量(如 Vector₀)与一个数据向量(如 D₀-D₇)的所有维度之间的距离。
- 并行粒度:在单个数据向量的不同维度上并行计算(如同时计算 D₀、D₁、D₂…的距离部分)。
步骤解析:
- D₀-D₇:数据向量的 8 个维度(或 8 个数据点)。
- Query Vector₀:需要匹配的目标查询向量。
- load(1), load(2):分批次加载数据(如先加载 D₀-D₃,再加载 D₄-D₇)。
- fmadd(1):计算load里面加载第一维度的数据平方再加上第五维度的平方,就是先计算乘积,再计算和。如((Query - D₀)²+(Query - D 5 D_5 D5)²)。
- SIMD result register:存储中间结果。
- SIMD reduce:对部分距离结果求和(如 D₀² + D₁² + … + D₇²),得到最终距离。
V₀ distance:查询向量与当前数据向量的完整距离。
2. 垂直方向(Vertical)的流程与含义
核心思想:单个维度 vs. 多条数据向量(批量处理)
-
适用场景:计算查询向量的 某一个维度(如 Dim₀) 与 多条数据向量的同一维度 的距离部分。
-
并行粒度:在多个数据向量的同一维度上并行计算(如同时计算 100 条向量的 D₀ 维度)。
步骤解析:
-
D₀:所有数据向量的第 0 个维度(如 100 条向量的“颜色”维度)。
-
Query Dim₀:查询向量的第 0 个维度被 广播(复制到所有处理单元)。
-
load (重复操作):加载多条数据向量的 D₀ 值(如 Vector₁-D₀, Vector₂-D₀…)。
-
fmadd(d):计算查询维度与所有数据向量 D₀ 的差值(如 (Query-D₀)²)。
-
SIMD result registers:存储部分距离结果(每条向量的 D₀ 部分结果)。
-
Partial Distances at D₀:当前维度的中间结果,后续需与其他维度累加。
关键点:
一次处理 一个维度 vs. 多条数据向量。
适合 批量查询(如数据库中对 100 条数据同时计算相似度)。