1

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

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

4

1 回答 1

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 + bwherea和是向量) bc那么从内存中获取数据的时间要比 的执行时间长得多add。另一方面,c = log(a) + log(b);几乎肯定会“隐藏”加载和存储结果的时间,因为log它本身比加载或存储操作花费的时间要长得多。

于 2013-04-25T10:40:06.810 回答