在我看来,我并不完全理解失败的概念。在CUDA样本中,有矩阵乘法示例(0_Simple/matrixMul)。在本例中,每个矩阵乘法的触发器(带有浮点的操作)的数目是通过公式计算的:
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)的一个元素,必须执行m乘法和(m-1)加法操作。因此,运算的总数(计算n x k元素)是m*n*k乘法和(m-1)*n*k加法。
当然,我们也可以设置m*n*k添加的数量,操作的总数将是2*n*m*k,其中一半是乘法,另一半是加法。
但是,我想,乘法比加法在计算上更昂贵。为什么这两种操作是混在一起的?计算机科学总是这样吗?如何考虑两种不同类型的操作?
对不起我的英语)
发布于 2014-12-16 17:30:49
简单地说,是的,它们包括乘法和加法。尽管大多数浮点处理器都有一个融合的乘/添加操作,但它们仍然将乘法计算为两个单独的浮点操作。
这就是为什么几十年来人们一直抱怨失败基本上是一个毫无意义的衡量标准的原因之一。也就是说,您几乎需要指定用于度量失败的特定代码体(例如,"Linpack“)。即使如此,有时您也需要相当严格地控制编译器的优化,以确保您所测量的是真正的机器速度,而不是编译器简单地消除某些操作的能力。
最终,正是出于这样的考虑,形成了一些组织来建立基准和规则,说明如何运行这些基准并报告结果(例如,规范)。否则,很难确定您所看到的两个不同处理器的结果在任何有意义的方式上都是可比较的。即使有了它,比较也会很困难,但如果没有这些东西,它们就会变得毫无意义。
https://stackoverflow.com/questions/27510237
复制相似问题