我想知道如何为我的程序计算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
, b
和c
是向量),那么从内存中获取数据的时间明显长于add
的执行时间。另一方面,c = log(a) + log(b);
几乎肯定会"隐藏"加载和存储结果的时间,因为log
本身比加载或存储操作花费的时间要长得多。