基本功能的典型执行时间

Rom*_*lov 2 c++ performance assembly low-level

众所周知,用于乘法的处理器指令所需的时间比加法多几倍,除法甚至更差(UPD:不再适用,见下文).那些更复杂的操作如指数呢?他们有多难?

动机.我感兴趣,因为它有助于算法设计在早期阶段估计算法的性能关键部分.假设我想对图像应用一组过滤器.其中一个在每个像素的3×3邻域上运行,将它们相加并取得atan.另一个相加较多的相邻像素,但不使用复杂的功能.哪一个会执行更长时间?

因此,理想情况下我希望具有基本操作执行的近似相对时间,例如乘法通常需要比加法多5倍的时间,指数大约是100次乘法.当然,这是一个数量级的协议,而不是确切的值.我知道它取决于硬件和参数,所以我们说我们测量现代x86/x64上浮点运算的平均时间(在某种意义上).对于未在硬件中实现的操作,我对C++标准库的典型运行时间感兴趣.

在分析这样的事情时,您是否看过任何消息来源?这个问题有意义吗?或者没有像这样的经验法则可以在实践中应用?

Ste*_*non 8

首先,我们要清楚.这个:

众所周知,用于乘法的处理器指令所需的时间比加法多几倍

一般来说不再是真的.许多年都不是这样,需要不再重复.在大多数常见架构中,整数乘法是几个周期,整数加法是单周期; 浮点加法和乘法往往具有几乎相等的时序特性(通常约4-6个周期的延迟,具有单周期吞吐量).

现在,根据您的实际问题:它随架构和实现而变化.在最近的架构中,有一个编写良好的数学库,简单的基本函数exp,log通常需要几十个周期(20-50个周期是一个合理的背后数字).使用质量较低的库,您有时会看到这些操作需要几百个周期.

对于更复杂的功能,例如pow,典型的时序范围从高几十到几百个周期.