计算GFlops

时间:2013-04-25 09:57:47

标签: c++ cuda flops

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

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

1 个答案:

答案 0 :(得分:1)

ACTUAL浮点运算的数量取决于代码的确切编写方式(编译器可以在两个方向上进行优化 - 也就是说,合并常见的操作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等)将需要多于一个,通常超过十个运算来获得结果。

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