【发布时间】:2019-01-17 12:58:38
【问题描述】:
假设您试图将一个浮点数 k 乘以一个小的整数常量 n(我的意思是 -20 <= n <= 20)。这样做的天真方法是将n 转换为浮点数(就本问题而言,它不计入运行时)并执行浮点乘法。然而,对于n = 2,k + k 似乎是一种更快的计算方式。在n,乘法指令比重复加法更快(如果n < 0,则在末尾加上反转)?
请注意,我在这里并不特别关心准确性;我愿意允许不合理的优化,只要它们得到大致正确的答案(即:最多 1024 ULP 错误可能没问题)。
我正在编写 OpenCL 代码,因此我对这个问题在许多计算环境(x86-64、x86-64 + AVX256、GPU)中的答案很感兴趣。
我可以对此进行基准测试,但由于我没有考虑特定的架构,我更喜欢选择的理论依据。
【问题讨论】:
-
这真的取决于架构,因为有些可以快速从整数转换为浮点,有些则没有。如果可能,最好将 n 存储为浮点类型
-
浮点乘法与当今的普通处理器一样快或几乎一样快。处理器的乘法单元可能比加法单元少,因此您可以在单位时间内完成更多的加法运算。否则,优化空间不大。
-
如果您的值不存在溢出的风险,那么对于与 2、4、8 和 16 的乘法,您只需将指数分别增加 1、2、3 和 4。然后将中间结果相加(即 X*10 与 X*2 + X*8 相同)。但是 1)需要了解 FP 值的内部表示,以及 2)我不确定(还没有尝试过)这是否比简单的 X*10.0 更快。
-
@phuclv 我在问题中说整数到浮点数的转换不计入运行时(因为我在编译时知道所有相关整数)。
标签: performance floating-point opencl