【问题标题】:FMA performance compared to naive calculationFMA 性能与简单计算的比较
【发布时间】:2015-05-26 22:51:56
【问题描述】:

我正在尝试比较 FMA 性能(math.h 中的fma())与浮点计算中的幼稚乘法和加法。测试很简单。我将对大迭代次数进行相同的计算。为了进行精确的检查,我必须完成两件事。

  1. 计数时间不应包括其他计算。
  2. 不应针对 FMA 优化朴素的乘法和加法
  3. 不应优化迭代。即迭代应该完全按照我的预期进行。

为了实现上述目标,我做了以下操作:

  1. 函数是内联的,只包括所需的计算。
  2. 使用 g++ -O0 选项不优化乘法。 (但是当我查看转储文件时,它似乎为两者生成几乎相同的代码)
  3. 使用volatile

但结果显示几乎没有区别,甚至比天真的乘法和加法更慢fma()这是我想要的结果(即它们在速度方面并没有真正不同)还是我做错了什么?

规格

  • Ubuntu 14.04.2
  • G++ 4.8.2
  • Intel(R) Core(TM) i7-4770(3.4GHz,8MB 三级缓存)

我的代码

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <chrono>
using namespace std;
using namespace chrono;

inline double rand_gen() {
    return static_cast<double>(rand()) / RAND_MAX;
}

volatile double a, b, c;
inline void pure_fma_func() {
    fma(a, b, c);
}
inline void non_fma_func() {
    a * b + c;
}


int main() {
    int n = 100000000;

    a = rand_gen();
    b = rand_gen();
    c = rand_gen();

    auto t1 = system_clock::now();
    for (int i = 0; i < n; i++) {
        non_fma_func();
    }
    auto t2 = system_clock::now();
    for (int i = 0; i < n; i++) {
        pure_fma_func();
    }
    auto t3 = system_clock::now();

    cout << "non fma" << endl;
    cout << duration_cast<microseconds>(t2 - t1).count() / 1000.0 << "ms" << endl;
    cout << "fma" << endl;
    cout << duration_cast<microseconds>(t3 - t2).count() / 1000.0 << "ms" << endl;
}

【问题讨论】:

  • 我用:g++ test.cpp -mfma -O0 -o test 编译,结果显示两者都大约 250 毫秒。
  • 带有-O0 的基准毫无价值。
  • 比较 -O0-O2-O3 的汇编程序,看看删除了多少垃圾。尤其是跳跃、装载和存储,这可能很昂贵。你的测试有点臃肿。

标签: c++ fma


【解决方案1】:

是的,你做错了。至少有两件事。但让我们保持简单。

Used g++ -O0 option not to optimize the multiplication

这会使您的整个结果完全无关紧要。有趣的事实:无论哪种情况,函数调用的成本都可能超过计算的成本。

从根本上说,未启用优化的基准测试结果完全没有意义。你不能只是把它们关掉,然后寄希望于最好的结果。它们绝对必须启用。

其次,FMA 与常规乘加是一个复杂的情况 - 在延迟与吞吐量以及其他问题上,乘加可能会胜出。

简而言之,您的基准测试根本不是基准测试,它只是一堆随机指令,会产生无意义的垃圾。

如果您想要一个准确的基准,您必须完全准确地再现实际使用情况。包括周边代码、编译器优化、整个shebang。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2012-10-24
    • 2016-11-21
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多