3

在我看来,我并不完全理解 FLOPS 的概念。在 CUDA SAMPLES 中,有矩阵乘法示例 (0_Simple/matrixMul)。在此示例中,每个矩阵乘法的 FLOP(浮点运算)数通过以下公式计算:

 double flopsPerMatrixMul = 2.0 * (double)dimsA.x * (double)dimsA.y * (double)dimsB.x;

所以,这意味着,为了将矩阵乘以A(n x m)B(m x k)我们需要做:2*n*m*k浮点运算。

但是,为了计算结果矩阵的 1 个元素C (n x k),必须执行m乘法和(m-1)加法运算。因此,操作总数(计算n x k元素)是m*n*k乘法和(m-1)*n*k加法。

当然,我们也可以设置加法的次数为m*n*k,总运算次数为2*n*m*k,一半是乘法,一半是加法。

但是,我想,乘法比加法计算成本更高。为什么这两种操作混在一起?计算机科学总是如此吗?如何考虑两种不同类型的操作?

对不起我的英语不好)

4

1 回答 1

2

简短的回答是,是的,它们计算乘法和加法。即使大多数浮点处理器具有融合的乘法/加法运算,它们仍然将乘法和加法计算为两个单独的浮点运算。

这就是为什么人们几十年来一直抱怨 FLOPs 基本上是一个毫无意义的衡量标准的部分原因。稍微有点意思,您几乎需要指定一些特定的代码体来测量 FLOP(例如,“Linpack gigaflops”)。即使这样,您有时也需要对允许进行哪些编译器优化等事情进行相当严格的控制,以确保您测量的是真正的机器速度,而不是编译器简单地消除某些操作的能力。

归根结底,正是这些担忧导致组织成立了基准和规则,这些基准必须如何运行以及如何报告结果(例如,SPEC)。否则,可能很难确定您看到的针对两个不同处理器报告的结果在任何有意义的方式上是否真正具有可比性。即使有了它,比较也可能很困难,但如果没有这些东西,它们就会变得毫无意义。

于 2014-12-16T17:30:49.560 回答