gpt4 book ai didi

performance - float vs 定点数 : speed on Intel I5 CPU

转载 作者:行者123 更新时间:2023-12-05 00:17:38 26 4
gpt4 key购买 nike

我有一个涉及密集型的 C/C++ 程序 32 位浮点 矩阵数学计算,如加法、减法、乘法、除法等。

我可以通过转换 来加速我的程序吗? 32 位浮点 数字变成 16 位定点 数字?我可以获得多少速度增益?

目前我正在研究 Intel I5 CPU。我正在使用 Openblas 来执行矩阵计算。我应该如何重新实现诸如 cblas_dgemm 之类的 Openblas 函数来执行定点计算?

我知道 SSE(Simple SIMD Extensions) 一次操作 4x32=8x16=128 位数据,即 4 个 32 位浮点类型或 8 个 16 位定点类型。我想在从 32 位浮点数转换为 16 位定点数后,我的程序会快两倍。

最佳答案

总结:现代 FPU 硬件很难被定点击败,即使每个向量的元素数量是其两倍。

现代 BLAS 库通常针对缓存性能(具有缓存阻塞/循环平铺)以及指令吞吐量进行了很好的调整。这让他们很难被击败。特别是 DGEMM 为这种优化提供了很大的空间,因为它对 O(N^2) 数据执行 O(N^3) 工作,因此值得只转置一个输入的缓存大小的块,以及类似的东西。

以 16 位半浮点格式存储浮点数可能有助于减少内存瓶颈 .没有硬件支持以这种格式对它们进行数学运算,只有一些指令可以在加载/存储时在该格式和普通 32 位元素浮点向量之间进行转换:VCVTPH2PS ( __m256 _mm256_cvtph_ps(__m128i) )VCVTPS2PH ( __m128i _mm256_cvtps_ph(__m256 m1, const int imm8_rounding_control) .这两条指令构成了 F16C extension ,首先由 AMD Bulldozer 和 Intel IvyBridge 支持。

IDK,如果有任何 BLAS 库支持该格式。

固定点:

SSE/AVX 没有任何整数除法指令。但是,如果您只除以常量,则可能不需要真正的 div 指令。所以这是定点的一个主要绊脚石。

固定点的另一个很大的缺点是在乘法后移动以纠正小数(二进制?)点的位置的额外成本。这将吞噬每个具有 16 位定点的向量的两倍元素所带来的任何 yield 。

SSE/AVX 实际上有很多打包的 16 位乘法选择(比​​任何其他元素大小都好)。有压缩乘法产生低半部分,高半部分(有符号或无符号),甚至还有一个从顶部下方的 2 位中取 16 位,并进行舍入( PMULHRSW.html )。 Skylake 以每个时钟两个的速度运行,有 5 个周期的延迟。还有整数乘加指令,但它们在乘法结果对之间进行水平加法。 (参见 Agner Fog's insn tables ,以及 标签维基以获得性能链接。)Haswell 和以前的没有那么多整数向量加法和乘法执行单元。通常是总 uop 吞吐量的代码瓶颈,而不是特定的执行端口。 (但是一个好的 BLAS 库甚至可能已经手动调整了 asm。)

如果您的输入和输出是整数,则使用整数向量通常会更快,而不是转换为浮点数。 (例如,请参阅我对 Scaling byte pixel values (y=ax+b) with SSE2 (as floats)? 的回答,我使用 16 位定点来处理 8 位整数)。

但是,如果您真的在使用浮点数,并且有很多乘法和除法要做,那么只需使用硬件 FPU。它们在现代 CPU 中非常强大,并且已经使定点在许多任务中大多已过时。正如@Iwill 指出的那样,FMA 指令是 FP 吞吐量(有时是延迟)的又一重大提升。

整数加/减/比较指令(但不是乘法)的延迟也低于它们的 FP 对应指令。

关于performance - float vs 定点数 : speed on Intel I5 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39677723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com