【问题标题】:Calculating GFlops计算 GFlops
【发布时间】:2013-04-25 09:57:47
【问题描述】:

我想知道如何为我的程序(比如 CUDA 应用程序)计算 GFlops。

我是否需要测量代码中的执行时间和浮点运算的数量?如果我有一个像“logf”这样的操作,它会只算一次失败吗?

【问题讨论】:

  • 我怀疑日志函数是 1 flop
  • Log 是一种非常复杂的操作,即使它在一个周期内执行,也可以声称它需要 10 到 100 个 FLO(省略 'P' 代表 'per')。

标签: c++ cuda flops


【解决方案1】:

ACTUAL 浮点运算的数量将取决于代码的编写方式(编译器可以双向优化 - 即合并常用操作 c = (a * 4.0 + b * 4.0); 可以变成 c = (a + b) * 4.0,比你写的少一个. 但是编译器也可以将某些东西转换为 MORE 操作:

 c = a / b;

可能变成:

 temp = 1 / b;
 c = temp * a;

(这是因为 1/x 比 y/x 更“简单”,并且乘法比除法更快)。

正如 cmets 中提到的,一些浮点运算(log、sin、cos 等)需要不止一次,通常是十多次运算才能得到结果。

另一个需要考虑的因素是“负载”和“存储”。这些可能很难预测,因为它高度依赖于编译器代码生成、编译器在给定点可用的寄存器数量等。加载和存储是否实际计数取决于您如何看待事物,但它们肯定会计入总执行时间。如果有很多数据需要处理,但每个步骤都非常简单(例如c = a + b,其中abc 是向量),则从内存中获取数据的时间明显长于add 的执行时间。另一方面,c = log(a) + log(b); 几乎肯定会“隐藏”加载和存储结果的时间,因为log 本身比加载或存储操作花费的时间要长得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多