资讯详情

资讯详情

【FHE 同态加密】我们如何实现同态加密推理(十二):为什么我们把 OpenMP 换成了自研线程池(纯 C11 并行)

【FHE 同态加密】我们如何实现同态加密推理十二为什么我们把 OpenMP 换成了自研线程池纯 C11 并行关键词同态加密 FHE 线程池 OpenMP 并行计算 纯 C11 小并行区 大模型密文推理 性能优化导读同态加密推理的并行结构是嵌套且细碎的112 个素数各自的 NTT、2048 个系数的模乘很多并行区只有微秒级。OpenMP 每次 fork/join 的唤醒开销比干活还大。本篇讲我们为什么在纯 C11 里自研线程池替换 OpenMP以及换来的代价非可重入、不支持嵌套并行。项目仓库Gitee 主仓https://gitee.com/pei-xiaoguang/kestrel-llmGitHub 镜像https://github.com/m13253246268-ship-it/kestrel-llm相关文档术语与数据口径 性能与基准 构建与复现 快速上手 架构总览0. 一句话结论vllm_tp.c是一个自研线程池用来替换 OpenMP 运行时tp thread pool。动机很具体OpenMP 每个并行区都要fork/join。而 FHE 的并行粒度往往很小比如对 112 个素数分别做 NTT一个并行区可能只有几微秒的活——此时唤醒开销比干活本身还大。自研池的做法是持久化的 worker 线程 自旋再等待的混合等待 调用线程自己也干活。API 刻意做成 1:1 对应 OpenMP让每个调用点能直接替换。1. 动机小并行区的唤醒税OpenMP 的模型是进入并行区 → 唤醒线程 → 分发任务 → 汇合。对粗粒度任务几百毫秒一段这完全没问题。但 FHE 的并行结构是嵌套且细碎的112 个素数 → 每素数一个 NTTn 2048个系数 → 每系数一次模乘密文分量 × 素数 × 系数三层循环里处处可并行。这些并行区的执行时间可能只有微秒级。而每次进入并行区OpenMP 都要付一次线程池唤醒/汇合的成本。结果是花了大量时间在叫醒工人而不是干活。2. 三条设计决策头注释把设计讲得很清楚逐条看2.1 持久 worker “先自旋再等待”Persistent worker threads are created once (lazy, on first parallel call) and reuse a spin-then-event wait between jobs, so small parallel regions pay ~µs of dispatch instead of OpenMP’s thread-pool wake cost.关键点只创建一次懒初始化第一次发起并行调用时创建之后复用等待策略是混合的先自旋spin一小段如果还没活干再退化成事件等待event wait。这个spin-then-event是并行编程里的经典取舍纯自旋浪费 CPU纯事件等待延迟高。先自旋后阻塞两头兼顾——而这也正是我们在多进程环境下需要用VLLM_TP_SPIN之类的开关来调的原因自旋策略在超订场景下会互相抢核。2.2 调用线程自己也干活The CALLING thread participates: it executes its own chunk and joins the workers with a wait, so the common case adds no idle-thread wake latency.这是一个很实在的优化发起并行的那个线程不是监工它自己也分一块活。于是常见情况下不需要额外唤醒——本来就醒着的那个线程立刻开始算。API 上对应两条规则头注释原文vllm_tp_parfor调用者拿最后一块caller takes the last chunkvllm_tp_worker_id在并行区内caller 的 id 是nthreads-1在并行区外是-1。第二条尤其重要——它让我是第几号工人这件事在区内区外语义一致避免调用点写出区内一套、区外一套的分支。2.3 静态连续分块 绑物理核Static contiguous chunking matches the OpenMPschedule(static)split the codebase already relies on (uniform per-row cost).Workers bind to physical cores at creation (NUMA/affinity axioms: skip SMT siblings on x86, pin to the A76 cluster on RK3588).两点分块策略照抄schedule(static)因为 FHE 里每一行的代价基本一致每个素数一个 NTT、每个系数一次模乘静态连续分块不会有负载不均问题而且分块确定 → 结果确定这对我们是重要的本系列第 13 篇绑核x86 上跳过 SMT 兄弟核只绑物理核RK3588 上绑A76 大核簇。这两个平台策略不同写在同一个池里。3. API刻意做成 OpenMP 的镜像这个设计选择很值得学习——不发明新范式只换实现。头注释直接给了映射表OpenMP自研池#pragma omp parallel for schedule(static)vllm_tp_parfor(...)#pragma omp parallel手工按 tid 拆分vllm_tp_parcall(...)omp_get_thread_num()vllm_tp_worker_id()omp_get_max_threads()/omp_set_num_threads()vllm_tp_threads()/vllm_tp_init()omp_get_wtime()vllm_tp_wtime()好处是迁移风险极低每个调用点都是机械替换语义一一对应出问题容易二分定位。几个实现细节都写在头文件里voidvllm_tp_parfor(intstart,intend,void(*body)(void*,int),void*ctx);/* static contiguous chunkscaller 拿最后一块 池只有 1 个线程、或区间小到没必要时退化成调用者上的串行循环 */intvllm_tp_worker_id(void);/* workers 0..nworkers-1区内 caller nthreads-1区外 -1 */doublevllm_tp_wtime(void);/* QueryPerformanceCounter / CLOCK_MONOTONIC */voidvllm_tp_shutdown(void);/* 幂等 */vllm_tp_wtime()的两套实现Windows 用QueryPerformanceCounter、Linux 用CLOCK_MONOTONIC说明这个池是跨平台的——这跟项目里同一源码在 x86-64 与 aarch64 逐系数位级一致的目标是一致的。4. 代价与限制必须说清自研的代价写在注释里而且是明确的能力削减Thread-safety:vllm_tp_parfor/parcallare NOT re-entrant; nested parallel regions from a worker are not supported (the engine does not use them).限制含义非可重入不能从并行区内再发起一个并行区不支持嵌套并行引擎里确实没有这种用法但这条约束没有编译期检查只能靠约定默认线程数每物理核一个x86 跳 SMTRK3588 4×A76引擎不用嵌套并行是一句承诺不是一条保证。将来有人写了一个嵌套调用编译器不会拦运行时会静默出错。这是这笔交易里最需要警惕的地方。5. 它与位级可复现的隐秘关联我们把 OpenMP 换掉不只是为了快。一个确定的线程池是实现确定性的前提。自研池用静态连续分块分块结果是确定的而 OpenMP 的分块策略在不同版本、不同实现GCC 的 libgomp vs LLVM 的 libomp之间可能不同。也就是说如果并行分块本身不确定位级一致就无从谈起。但要说清楚——换掉 OpenMP 并没有解决位级一致问题。真正的根因在别处RNG 播种本系列第 13 篇专门讲。这里只是说明自研池是位级可复现这条路上的必要但不充分条件。6. 安全边界务请读完本文所述参数为机制验证级远低于 HE 参数标准的 128-bit 水平不得用于保护真实数据。 本文主张的是并行运行时替换的动机与设计。 本文不主张性能优越性。必须补一句绩效上我们没有归档自研池 vs OpenMP的同轮交错 A/B 数据。按本项目纪律跨轮不可比绝对值本文因此不给出任何加速比。这是本文最大的空缺。7. 这一篇的未解问题缺少同轮 A/B 的量化证据。动机唤醒税在原理上成立但到底省了多少没有实测归档。这是应该补的第一个实验。自旋策略没有自适应。VLLM_TP_SPIN这类开关目前是手工设置的经验值。理想情况下应该根据上一轮等待时长自动在自旋与阻塞之间切换。非可重入是静默失败。加一个当前是否已在并行区内的断言debug 构建下成本极低收益很直接。绑核策略没有形成文档化的决策依据。x86 跳 SMT、RK3588 绑 A76这两个选择背后的实测数据没有归档。换平台的人只能抄结论抄不到理由。下一篇是本系列里我认为最有价值的一篇位级可复现性——4 线程与 8 线程为什么算出的结果位级不同以及为什么修好了这句话我们到现在都说不出口。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →