256 位定点运算,未来?
256 bit fixed point arithmetic, the future?
只是一些愚蠢的想法,但如果计算机能够有效地计算 256 位算术,比如说如果它们有一个 256 位架构,我认为我们能够取消浮点。我还想知道,是否有任何理由超越 256 位架构?我对此的基础相当脆弱,但我相信如果我错了你会纠正我的错误;)这是我的想法:
您可以使用 256 位类型,其中 127 或 128 位用于整数,127 或 128 位用于小数值,当然还有符号位。如果您拥有能够毫无问题地计算、存储和移动如此大的数字的硬件,我认为您将能够处理遇到的任何计算。
一个例子:如果你处理的是长度,并且你以米为单位表示所有值,那么最小值 (2^-128 m) 将小于普朗克长度,而最大值 (2^127 m) 将大于可观测宇宙的直径。想象一下以小于普朗克长度的精度计算光年距离?
好的,这只是一个例子,但我正在努力想出任何可能需要比这更大或更小的数字的情况。有什么想法吗?定点运算是否存在我没有考虑过的可能问题?创建 256 位架构是否存在问题?
SIMD 将使窄类型永远有价值。如果可以进行 256 位加法,则可以在同一硬件上并行执行八个 32 位整数加法(通过不跨元素边界传播进位)。或者你可以做 32 个 8 位加法。
Hardware multiplier circuits 制造更宽的成本要高得多,因此假设 256b X 256b 乘法器的构建是可行的并不是一个好的假设。
即使除了 SIMD 考虑因素,内存带宽/高速缓存占用也是一个大问题。
所以 4B float
将继续表现出色,因为它足够精确,很有用,但又足够小,可以将许多元素打包到一个大向量中,或者放在缓存中。
浮点数还允许 多 更广泛的数字范围,方法是将其某些位用作指数。对于尾数 = 1.0,IEEE binary64 double
的范围从 2-1022 到 21023,对于 "normal" 个数 (整个范围内的 53 位尾数精度,对于非正规化(逐渐下溢)只会变得更差)。您的提案仅处理从 2-127(精度为 1 位)到 2127(精度为 256b)的数字。
浮点数有 the same number of significant figures at any magnitude (until you get into denormals very close to zero), because the mantissa is fixed width. Normally this is a useful property, especially when multiplying or dividing. See 的例子说明了为什么 FP 很好。 (虽然减去两个附近的数字是个问题...)
尽管目前的SIMD指令集已经有256b的向量,但对于add,最宽的元素宽度是64b。 AVX2 的最宽乘法是 32bit * 32bit => 64bit.
AVX512DQ has a 64b * 64b -> 64b (low half) vpmullq
, which may show up in Skylake-E (Purley Xeon).
AVX512IFMA introduces a 52b * 52b + 64b => 64bit integer FMA. (VPMADD52LUQ
low half and VPMADD52HUQ
high half.) The 52 bits input precision is clearly so they can use the FP mantissa multiplier hardware, instead of requiring separate 64bit integer multipliers. (A full vector width of 64bit full-multipliers would be even more expensive than vpmullq
. A compromise design like this even for 64bit integers should be a big hint that wide multipliers are expensive). Note that this isn't part of baseline AVX512F either, and may show up in Cannonlake,基于 Clang git 提交。
在 SIMD 中支持任意精度 adds/multiplies(对于像 RSA 这样的加密应用程序)是可能的,如果指令集是为它设计的(英特尔 SSE/AVX 不是)。 Discussion on Agner Fog's recent proposal for a new ISA included an idea for SIMD add-with-carry.
要在 32 位或 64 位硬件上实际实现 256b 数学运算,请参阅 https://locklessinc.com/articles/256bit_arithmetic/ and https://gmplib.org/。考虑到很少需要它,这真的没那么糟糕。
使用非常宽的整数寄存器构建硬件的另一个大缺点是,即使高位通常未使用,乱序执行硬件也需要能够处理使用它的情况。这意味着与具有 64 位寄存器的体系结构相比,物理寄存器文件要大得多(这很糟糕,因为它需要非常快并且在物理上靠近 CPU 的其他部分,并且有许多读取端口)。例如Intel Haswell has 168-entry PRFs 表示整数,FP/SIMD.
FP 寄存器文件已经有 256b 个寄存器,所以我想如果你打算做这样的事情,你会用使用 SIMD 向量寄存器的执行单元来做 inputs/outputs,而不是扩大整数寄存器。但是 FP/SIMD 执行单元通常不连接到整数进位标志,因此您可能需要一个单独的 SIMD 进位寄存器来进行 256b 加法。
Intel 或 AMD 已经实现了一个指令/执行单元,用于在 xmm 或 ymm 寄存器中添加 128b 或 256b 整数,但他们没有。 (即使用于加法,最大 SIMD 元素宽度也是 64 位。只有 shuffle 以整个寄存器为单位进行操作,然后才具有字节粒度或更宽。)
128 位计算机。它还与寻址内存有关,当我们 运行 寻址内存时输出 64 位。目前有4TB内存的服务器。这需要大约 42 位 (2^42 > 4 x 10^12)。如果我们假设内存价格每两年减半,那么我们每两年就需要多一点。我们仍然有 22 位剩余,所以至少 2 * 22 年,内存价格可能不会下降那么快 -> 超过 50 年,当我们 运行 64 位寻址能力不足时。
只是一些愚蠢的想法,但如果计算机能够有效地计算 256 位算术,比如说如果它们有一个 256 位架构,我认为我们能够取消浮点。我还想知道,是否有任何理由超越 256 位架构?我对此的基础相当脆弱,但我相信如果我错了你会纠正我的错误;)这是我的想法:
您可以使用 256 位类型,其中 127 或 128 位用于整数,127 或 128 位用于小数值,当然还有符号位。如果您拥有能够毫无问题地计算、存储和移动如此大的数字的硬件,我认为您将能够处理遇到的任何计算。
一个例子:如果你处理的是长度,并且你以米为单位表示所有值,那么最小值 (2^-128 m) 将小于普朗克长度,而最大值 (2^127 m) 将大于可观测宇宙的直径。想象一下以小于普朗克长度的精度计算光年距离?
好的,这只是一个例子,但我正在努力想出任何可能需要比这更大或更小的数字的情况。有什么想法吗?定点运算是否存在我没有考虑过的可能问题?创建 256 位架构是否存在问题?
SIMD 将使窄类型永远有价值。如果可以进行 256 位加法,则可以在同一硬件上并行执行八个 32 位整数加法(通过不跨元素边界传播进位)。或者你可以做 32 个 8 位加法。
Hardware multiplier circuits 制造更宽的成本要高得多,因此假设 256b X 256b 乘法器的构建是可行的并不是一个好的假设。
即使除了 SIMD 考虑因素,内存带宽/高速缓存占用也是一个大问题。
所以 4B float
将继续表现出色,因为它足够精确,很有用,但又足够小,可以将许多元素打包到一个大向量中,或者放在缓存中。
浮点数还允许 多 更广泛的数字范围,方法是将其某些位用作指数。对于尾数 = 1.0,IEEE binary64 double
的范围从 2-1022 到 21023,对于 "normal" 个数 (整个范围内的 53 位尾数精度,对于非正规化(逐渐下溢)只会变得更差)。您的提案仅处理从 2-127(精度为 1 位)到 2127(精度为 256b)的数字。
浮点数有 the same number of significant figures at any magnitude (until you get into denormals very close to zero), because the mantissa is fixed width. Normally this is a useful property, especially when multiplying or dividing. See
尽管目前的SIMD指令集已经有256b的向量,但对于add,最宽的元素宽度是64b。 AVX2 的最宽乘法是 32bit * 32bit => 64bit.
AVX512DQ has a 64b * 64b -> 64b (low half) vpmullq
, which may show up in Skylake-E (Purley Xeon).
AVX512IFMA introduces a 52b * 52b + 64b => 64bit integer FMA. (VPMADD52LUQ
low half and VPMADD52HUQ
high half.) The 52 bits input precision is clearly so they can use the FP mantissa multiplier hardware, instead of requiring separate 64bit integer multipliers. (A full vector width of 64bit full-multipliers would be even more expensive than vpmullq
. A compromise design like this even for 64bit integers should be a big hint that wide multipliers are expensive). Note that this isn't part of baseline AVX512F either, and may show up in Cannonlake,基于 Clang git 提交。
在 SIMD 中支持任意精度 adds/multiplies(对于像 RSA 这样的加密应用程序)是可能的,如果指令集是为它设计的(英特尔 SSE/AVX 不是)。 Discussion on Agner Fog's recent proposal for a new ISA included an idea for SIMD add-with-carry.
要在 32 位或 64 位硬件上实际实现 256b 数学运算,请参阅 https://locklessinc.com/articles/256bit_arithmetic/ and https://gmplib.org/。考虑到很少需要它,这真的没那么糟糕。
使用非常宽的整数寄存器构建硬件的另一个大缺点是,即使高位通常未使用,乱序执行硬件也需要能够处理使用它的情况。这意味着与具有 64 位寄存器的体系结构相比,物理寄存器文件要大得多(这很糟糕,因为它需要非常快并且在物理上靠近 CPU 的其他部分,并且有许多读取端口)。例如Intel Haswell has 168-entry PRFs 表示整数,FP/SIMD.
FP 寄存器文件已经有 256b 个寄存器,所以我想如果你打算做这样的事情,你会用使用 SIMD 向量寄存器的执行单元来做 inputs/outputs,而不是扩大整数寄存器。但是 FP/SIMD 执行单元通常不连接到整数进位标志,因此您可能需要一个单独的 SIMD 进位寄存器来进行 256b 加法。
Intel 或 AMD 已经实现了一个指令/执行单元,用于在 xmm 或 ymm 寄存器中添加 128b 或 256b 整数,但他们没有。 (即使用于加法,最大 SIMD 元素宽度也是 64 位。只有 shuffle 以整个寄存器为单位进行操作,然后才具有字节粒度或更宽。)
128 位计算机。它还与寻址内存有关,当我们 运行 寻址内存时输出 64 位。目前有4TB内存的服务器。这需要大约 42 位 (2^42 > 4 x 10^12)。如果我们假设内存价格每两年减半,那么我们每两年就需要多一点。我们仍然有 22 位剩余,所以至少 2 * 22 年,内存价格可能不会下降那么快 -> 超过 50 年,当我们 运行 64 位寻址能力不足时。