我在这里还是很新,我希望这个问题适合这个论坛,否则请帮助我将它迁移到更绿色的牧场。
我是一名电气工程师,专门研究应用数学来构建很酷的算法。有时在我的工作中,我尝试编写代码来帮助编译器生成运行速度与硬件允许的一样快的代码。前几天,我意识到当我将类型从 32 位浮点数更改为 64 位双精度并编译我的代码时......它运行得更快。
现代 CPU 架构 SIMD 指令和 CPU 中的其他怪癖是否真的比单精度浮点运算更优化双精度?
对我来说这似乎是真的,至少我的本地机器是这样。我对此感到惊讶,因为我认为您可以在相同的逻辑上容纳两倍的浮点数。也许是因为工业需求,人们普遍使用双精度而不是浮点数,这使得他们专注于对双精度算术的良好支持?
或者,如果我错了,这不是 CPU 设计的优先级,也许是编译器的优先级?
这是一些最小的 godbolt 示例,其中包含 Nx8 矩阵的矩阵向量乘法https://godbolt.org/z/gPR9wj
例如,看看 clang 9.1.0 和 gcc 8.1 如何产生非常不同的输出 wrt 代码大小对我来说很有趣。
不过,我无法得出关于 float 与 double 的太多结论。(我们可以根据需要将 scal typedef 更改为 float 或 double。)