我想知道如何为我的程序计算 GFlops,比如 CUDA 应用程序。
我需要测量代码中的执行时间和浮点运算的数量吗?如果我有一个像“logf”这样的操作,它会只算一次失败吗?
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
wherea
和是向量) b
,c
那么从内存中获取数据的时间要比 的执行时间长得多add
。另一方面,c = log(a) + log(b);
几乎肯定会“隐藏”加载和存储结果的时间,因为log
它本身比加载或存储操作花费的时间要长得多。