Lobsters | 📄 原文链接 | 2026-11-08 收录

Futhark 里的不确定性:浮点加法不满足结合律之后

来源:futhark-lang.org — 2026-11-04

📋 概述

Futhark 的博客借 IFL2026 上 Michael Haddon 的「Replay Lattice」类型系统,重新审视这门并行函数式语言里的不确定性。先立术语:Exact 保证每次结果相同;Replay 是同机器同调度下结果相同、换机器可能不同;Approx 则可能每次都不一样。浮点加法不满足结合律,并行求和会切块、各处理器分别求和再合并,顺序一变结果就变——这是 Replay;如果合并用了原子指令,同机重跑也可能不同——这是 Approx。语言层面还有两处「真」不确定性,都算程序员的账:一是 #[unsafe] 关掉检查后可以任意读写内存;二是 scatter 要求索引无重复、或重复处的值相同,但这条不做检查,违反时哪个写赢不可预测,最坏能出现两个值拼在一起的撕裂写。为什么不检查?scatter 是大多数复杂并行算法的基石,性能优先,而任何不违背代价模型(代价与写入元素数量成正比)的检查都很难构造。reduce 同理要求算子满足结合律,无从静态检查,只能经验测试。理论上可以改成树形归约让结果完全确定、C 与 CUDA 后端一致,但实测在 MI100 上 reduce (+) 0 比 sum_tree 快近 3 倍。

🔑 核心要点

💡 金句

重点在于结果会变;而既然结果本身(因为舍入误差)多少已经「错」了,真正的问题是有时候我们就是想要每次都拿到同一个「错」的结果。
← 返回 Lobsters 首页