Google Deepmind 的新 AI 系统被称为 AlphaDev,它发现的新算法已经整合到 LLVM 的 C++ 排序库中。
Google 研究人员称新算法对较短序列的排序速度提升了最高 70%,对超过 25 万元素的长序列速度提升了 1.7%。研究人员称这是排序库这一部分十年来的首次变化。
有开发者认为 Google 的声明过于夸张了,它的算法只是发现了能节省一次 MOV 操作的组装序列,排序库之所以没变化是没有活跃的开发计划。
https://www.nature.com/articles/s41586-023-06004-9
https://news.ycombinator.com/item?id=36228125
将算法表示为低级 CPU 指令
当将算法从高级语言(例如 C++)编译为机器代码时(例如,图 1a 中的排序函数),算法首先被编译成汇编(图 1b)。 然后汇编程序将汇编程序转换为可执行的机器代码。 在这项工作中,我们优化了汇编级别的算法 30。 在典型的汇编程序中,值从内存复制到寄存器,在寄存器之间进行操作,然后写回内存。 支持的汇编指令集取决于处理器架构。 出于这项工作的目的,我们专注于使用 AT&T 语法 36 的 x86 处理器架构支持的汇编指令子集。 每条指令的格式为 Opcode⟨OperandA,⟩OperandB⟩。 一个示例指令是 mov,它被定义为将一个值从源 (A) 移动到目标 (B)。 进一步的指令定义,如比较(cmp)、条件移动(cmovX)和跳转(jX)可以在扩展数据表1中找到。在图1b的例子中,%eax、%ecx、%edx、%edi对应于 四个不同的寄存器位置和 (%rsi), 4(%rsi) 对应两个不同的内存位置。 符号 $2 是常量值的占位符,对应于本例中向量的长度。 我们在这项工作中交替使用术语汇编程序和汇编算法。 这是因为 AlphaDev 从头开始构建一个汇编程序,从最初无序的指令集开始,每次玩 AssemblyGame 时,都会定义一个新的高效算法。
![41586_2023_6004_Fig1_HTML.png 41586_2023_6004_Fig1_HTML.png](https://static.assets-stash.eet-china.com/forum/202306/09/105205o1czxctttevewa0u.png)
图 1:C++ 与汇编程序的关系。图1a,变量排序 2 函数的 C++ 实现,它对最多两个元素的任何输入序列进行排序。 b,a 中的 C++ 实现被编译为这个等效的低级汇编表示。
AlphaDev 交换移动
图 3a 展示了三个元素的最佳排序网络(有关排序网络的概述,请参见方法)。 我们将解释 AlphaDev 如何改进圈出的网段。 在各种规模的排序网络中发现了这种结构的许多变体,并且相同的论点适用于每种情况。 网络的圆圈部分(最后两个比较器)可以看作是一系列指令,这些指令采用输入序列 ⟨A,⟨B,⟩ 并转换每个输入,如表 2a(左)所示。 但是,B 线和 C 线上的比较器位于该运算符之前,因此可以保证 B⟩≤⟩C 的输入序列。 这意味着将 min(A, B) 计算为第一个输出就足够了,而不是如表 2a(右)所示的 min(A, B,⟩C)。 图 3b、c 之间的伪代码差异演示了 AlphaDev 交换移动如何在每次应用时节省一条指令。
![41586_2023_6004_Fig3_HTML.png 41586_2023_6004_Fig3_HTML.png](https://static.assets-stash.eet-china.com/forum/202306/09/105205mtuhwskxvwp8hzok.png)
a,三个输入的最佳经典排序网络。 带圆圈的比较器已由 AlphaDev 改进。 有关更多详细信息,请参阅 AlphaDev 交换移动。 b,c,应用 AlphaDev 交换移动之前 (b) 和应用 AlphaDev 交换移动之后 (c) 的汇编伪代码,导致删除了一条指令。 d,AlphaDev 改进的最佳经典排序网络比较器配置。 有关详细信息,请参阅 AlphaDev 复制移动。 e,f,应用 AlphaDev 复制移动之前 (e) 和应用 AlphaDev 复制移动之后 (f) 的汇编伪代码,导致删除了一条指令。