Calculating GFlops



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

我需要测量代码中的执行时间和浮点操作的数量吗?如果我有一个像"logf"这样的操作,它只算一次翻牌吗?

实际浮点操作的数量将取决于代码是如何编写的(编译器可以在两个方向上进行优化)-也就是说,合并常见操作c = (a * 4.0 + b * 4.0);可以变成c = (a + b) * 4.0,这比您编写的要少一个。但是编译器也可以把一些东西转换成更多的操作:

 c = a / b;

可以变成:

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

(这是因为1/x比y/x"简单",乘法比除法快)。

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

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

相关内容

  • 没有找到相关文章

最新更新