【问题标题】:Estimating the efficiency of GPU in FLOPS (CUDA SAMPLES)在 FLOPS 中估计 GPU 的效率(CUDA SAMPLES)
【发布时间】:2015-02-15 02:16:57
【问题描述】:

在我看来,我并不完全理解 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,一半是乘法,一半是加法。

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

对不起我的英语)

【问题讨论】:

  • 大多数架构(包括 nVidia GPU)都支持融合乘法加法,因此您可以有效地免费获得加法并计算乘法。
  • 但在这种情况下,答案必须是m*n*k,比示例中的小一倍
  • 抱歉 - 没有仔细阅读。

标签: c++ cuda flops


【解决方案1】:

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

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

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

【讨论】:

  • 好的,据我所知,这样的估计有很多模棱两可的地方。谢谢
猜你喜欢
  • 2014-07-18
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2012-09-14
  • 2017-02-02
  • 2012-03-22
  • 2021-03-14
  • 2011-11-20
相关资源
最近更新 更多