我想知道是否有必要修改代码以使用 math.h
exp
的查找表,或者它是否由 clang++< 自动完成
当给定 -O3
标志时。
如果不是,是否有 #pragma
执行此操作?
澄清
我在谈论函数调用的内存。也就是说,如果函数传递了完全相同的参数(是的, float 实际上可以相同,如果它们是从常量和整数派生的)。
示例
假设我要运行 exp(-a*x)
其中 a
不是编译时常量,但一旦设置一次,它就不会被修改。类似地,x
可以是 10 个可能值之一,所有这些值都设置一次,并且不会再次修改。
最佳答案
我不太了解 clang 的具体细节,所以我无法详细说明它的作用。但我可以推断出它可以做什么。
如果参数是编译时常量,那么优化器可能能够在编译/链接时进行预计算。但这绝不是必需的,我也不希望所有编译器都这样做。
如果参数不是编译时常量,并且同一函数内的多个调用使用相同的参数(并且不涉及 volatile 对象),那么优化器可能会在知道函数不使用时重用结果有副作用。我建议您手动进行此优化,只是因为最好不要重复自己。
如果参数不是编译时常量,那么你可以将结果存储在某个地方的表中以备后用,但是加载值的内存访问可能比计算本身慢得多,所以这可能会结束是一种悲观。
显然,进行任何这些优化是否有任何意义将取决于许多方面,例如 CPU 架构、缓存等,最重要的是取决于操作是否首先对性能产生任何重大影响。
关于c++ - 用查找表替换 math.h exp 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49762186/