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