用查找 table 替换 math.h exp 调用
Replacing an math.h exp call with a lookup table
我想知道是否有必要修改代码以对 math.h
exp
使用查找 table,或者它是否由 clang++
在给定时自动完成-O3
标志。
如果不是,是否有 #pragma
可以做到这一点?
澄清
我在谈论函数调用的记忆。也就是说,如果函数传递了完全相同的参数(是的,浮点数实际上可以相同,如果它们是从常量和整数派生的)。
例子
说我要去 运行 exp(-a*x)
其中 a
不是编译时常量,但是一旦设置一次,就不会被修改。类似地,x
可以是 10 个可能值之一,所有这些值都设置一次,并且不会再次修改。
我不太了解 clang 的细节,所以我无法详细说明它的作用。但我可以推断出它可以做什么。
如果参数是编译时常量,那么优化器可能能够在 compile/link 时 pre-calculate。但这绝不是必需的,我不希望所有编译器都这样做。
如果参数不是编译时常量,并且同一函数内的多个调用使用相同的参数(并且不涉及易失性对象),那么优化器可能 re-use 如果它知道结果函数没有 side-effects。我建议您手动进行此优化,只是因为最好不要重复自己。
如果参数不是编译时常量,那么您可以将结果存储在 table 某个地方以备后用,但是加载值的内存访问可能比计算本身慢得多,所以这可能最终会成为一种悲观情绪。
显然,进行这些优化是否有任何意义将取决于许多方面,例如 CPU 架构、缓存等,最重要的是操作是否对性能有任何重大影响第一名。
我想知道是否有必要修改代码以对 math.h
exp
使用查找 table,或者它是否由 clang++
在给定时自动完成-O3
标志。
如果不是,是否有 #pragma
可以做到这一点?
澄清
我在谈论函数调用的记忆。也就是说,如果函数传递了完全相同的参数(是的,浮点数实际上可以相同,如果它们是从常量和整数派生的)。
例子
说我要去 运行 exp(-a*x)
其中 a
不是编译时常量,但是一旦设置一次,就不会被修改。类似地,x
可以是 10 个可能值之一,所有这些值都设置一次,并且不会再次修改。
我不太了解 clang 的细节,所以我无法详细说明它的作用。但我可以推断出它可以做什么。
如果参数是编译时常量,那么优化器可能能够在 compile/link 时 pre-calculate。但这绝不是必需的,我不希望所有编译器都这样做。
如果参数不是编译时常量,并且同一函数内的多个调用使用相同的参数(并且不涉及易失性对象),那么优化器可能 re-use 如果它知道结果函数没有 side-effects。我建议您手动进行此优化,只是因为最好不要重复自己。
如果参数不是编译时常量,那么您可以将结果存储在 table 某个地方以备后用,但是加载值的内存访问可能比计算本身慢得多,所以这可能最终会成为一种悲观情绪。
显然,进行这些优化是否有任何意义将取决于许多方面,例如 CPU 架构、缓存等,最重要的是操作是否对性能有任何重大影响第一名。