在我看来,我并不完全理解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
浮点运算。
但是,为了计算结果矩阵C (n x k)
的1个元素,必须执行m
乘法和(m-1)
加法运算。因此,操作总数(计算n x k
元素)是m*n*k
次乘法和(m-1)*n*k
次加法。
当然,我们也可以将加法次数设置为m*n*k
,操作总数为2*n*m*k
,其中一半是乘法和一半加法。
但是,我猜,乘法比计算更昂贵。为什么这两种类型的操作混在一起?计算机科学总是如此吗?如何考虑两种不同类型的操作?
对不起我的英文)
答案 0 :(得分:2)
简短的回答是,他们统计乘法和加法。尽管大多数浮点处理器都具有融合乘法/加法运算,但它们仍然计算乘法并添加为两个单独的浮点运算。
这是人们几十年来一直抱怨FLOP基本上是毫无意义的衡量标准的部分原因。即使是一点点,您几乎需要指定一些特定的代码体,您可以为其测量FLOP(例如," Linpack gigaflops")。即便如此,您有时需要对事物进行相当严格的控制,例如允许编译器优化以确保您测量的是真正的机器速度,而不是编译器简单地消除某些操作的能力。
最终,像这样的关注导致组织正在形成基准和规则,以确定必须如何运行这些基准并报告结果(例如,SPEC)。否则,您可能很难确定您为两个不同处理器报告的结果是否真的具有可比性。即便如此,比较也很困难,但如果没有这些东西,它们就会毫无意义。