我如何比较C ++中log()和fp的性能?

我在C ++中使用一个基于日志的类来存储非常小的浮点值(因为值超出了double的范围)。 由于我正在执行大量的乘法运算,因此将乘法运算转换为和运算具有额外的好处。

但是,在我的算法的某个点上,我需要将一个标准double值除以一个integer数值,然后将一个*=除以一个基于对数的值。 我已经为我的基于日志的类重载了*=运算符,并且通过运行log()并将其添加到左侧值,将右侧值首先转换为基于log()值。 因此实际执行的操作是浮点除法, log()和浮点求和。

我的问题是否首先将分母转换为基于对数值(它将用浮点减法代替浮点除法)会更快,从而产生以下操作链:两次log() ,浮点减法,浮点求和。

最后,这可以归结为浮点除法比log()更快还是更慢。 我怀疑一个普遍的答案是,这是编译器和架构的依赖,所以我会说我在达尔文10.3.0上使用Apple的gcc 4.2。 尽管如此,我希望能得到一个关于这两个操作符的速度和/或关于如何自己度量差异的想法的一般性评论的答案,因为这里可能会有更多的事情发生,例如执行进行类型转换的构造函数等等

干杯!


你是否多次被相同的整数除? 如果是这样,你可以乘以1./yourInteger ,并且只做一次除法。 如果可能的话,这将比任何一个都快。

至于你的实际问题,它不仅仅依赖于编译器和体系结构,而且还依赖于微架构和数据。

在你的特定平台(darwin / x86)上,对于当前的硬件i5 / i7:除(1)〜24周期, log( ) (2)〜35周期。 但是,因为divide只使用一个指令调度槽,所以硬件的重新排序引擎可以在分割过程中执行其他有用的计算; 相反, log( )是用软件实现的,因此处理器将其他计算提升到对数的等待时间的机会较少。 这意味着在实践中,分隔往往会更快一点。

1)从英特尔优化手册

2)通过在紧密循环中调用log( )并使用mach_absolute_time( )来获得墙壁时间来测量。


在x86架构上,对数比分割要长得多:对于FYL2X,85个周期(吞吐量),而对于FDIV则为40个周期。 如果其他体系结构有很大不同,我会感到惊讶。 与浮点部门一起去。


划分的主要问题是,尽管它是大多数现代CPU上的单一指令,但它通常具有高latency (PowerPC上的31个周期 - 不确定x86上的内容)。 如果您有其他可以与分部同时发布的非相关指令,则可以隐藏其中一些延迟。 所以答案在某种程度上取决于你在循环中包含你的鸿沟的指令组合和依赖关系(更不用说你正在使用哪个CPU)。

话虽如此,但我的直觉是,在大多数架构上,这种鸿沟比日志功能要快。

链接地址: http://www.djcxy.com/p/85639.html

上一篇: How can I compare the performance of log() and fp division in C++?

下一篇: Why doesn't clang/llvm optimize this?