c++ - 基本函数的典型执行时间

标签 c++ performance assembly low-level

众所周知,处理器的乘法指令比加法多花费数倍的时间,除法更糟(UPD:这不再是真的,见下文)。像指数这样更复杂的操作呢?它们有多难?

动机。我很感兴趣,因为它有助于算法设计在早期阶段估计算法的性能关键部分。假设我想对图像应用一组滤镜。其中之一对每个像素的 3×3 邻域进行操作,对它们求和并取 atan。另一种是对更多相邻像素求和,但不使用复杂的函数。哪个执行时间更长?

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

你在分析这种东西时有没有看到任何来源?这个问题有意义吗?或者在实践中无法应用这样的经验法则?

最佳答案

首先,让我们明确一下。这:

It is well-known that processor instruction for multiplication takes several times more time than addition

一般不再适用。很多很多年都不是这样了,需要停止重复。在大多数常见的体系结构中,整数乘法是一对周期,整数加法是单周期;浮点加法和乘法往往具有几乎相同的时序特性(通常大约有 4-6 个周期的延迟,具有单周期吞吐量)。

现在,对于您的实际问题:它因架构和实现而异。在最近的体系结构中,使用编写良好的数学库,explog 等简单的基本函数通常需要几十个周期(20-50 个周期是合理的回的信封图)。对于质量较低的库,您有时会发现这些操作需要数百个周期。

对于更复杂的函数,例如 pow,典型的时序范围从高十到数百个周期。

关于c++ - 基本函数的典型执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094585/

相关文章:

c++ - 构造函数和析构函数中的虚函数调用

performance - Spark不忽略空分区

assembly - 在 TASM x86 程序集中读取字符串

c++ - 运行时检查失败 #0。不知道如何使用 CDECL

math - 使用 NEON 对 ARM 汇编中的四字向量中的所有元素求和

c++ - 在 C++ 中将 `time_t` 转换为十进制年份

c++ - 当有人尝试在当前 .cpp 或 .h 文件中使用 STL 时显示错误(在 Visual Studio 中)

c++ - 如何获得两个数字字符串的总和 - C++

矩阵向量运算的Python向量化

R : Count unique element per interval