2个相同/不同矩阵相乘的性能

问题描述 投票:0回答:1

我正在对科学应用程序进行一些性能测试,并尝试考虑所有可能影响应用程序性能的元素(例如缓存大小层次结构CPU速度...缓存行以及可能与性能相关的内容)。我想到了这个问题,虽然它可能很愚蠢,但我想让它对我来说显而易见。

*问题:*

如果我不正确,请纠正我。处理 int 和 float 或 double 值的成本在处理器上是不同的,这是因为使用 CPU 浮点单元(计算浮点值)。现在我想知道用相同的浮点或双精度值填充两个二维矩阵并将它们相乘或用随机浮点或双精度值填充它们然后相乘之间是否有区别。编译器是否对所有元素都具有相同值的矩阵使用缓存?.

总共处理浮点值(A.B),其中A和B可以是不同大小的数字,如果A和B的大小对处理时间有任何影响(例如乘法)或没有?如果存在差异,考虑或不考虑是否重要? 。 我能够使用性能计数器库测量应用程序的性能,但由于所用库的开销,您不能确定指令/触发器变化是针对随机值或其他参数(如 I/Dcache 未命中、缓存大小、问题大小)或其他参数。

二手机器intel E4500。 编译器 g++ 4.7。

谢谢

c++ optimization compiler-optimization hardware
1个回答
2
投票

你是对的,整数和浮点算术成本是不同的,但并不像人们想象的那么多。它很大程度上取决于用于计算的处理器单元。特别是对于英特尔处理器,您可以在“优化参考手册”中找到有用的信息,网址为http://www.intel.com/products/processor/manuals/。附录 C 列出了所有指令的指令延迟。

对于您的具体问题,如果矩阵乘法的计算时间取决于两个矩阵的条目是否包含相同或随机值,那么答案是“否”。如果您查看指令的数量和顺序以及计算运行时的内存访问模式,就会发现这两种情况都是相同的。编译器通常也无法利用矩阵全部由相同条目组成的事实,因为矩阵乘法需要涵盖所有可能的情况。 (好吧,除非你将所有东西 - 填充矩阵条目和乘法本身 - 打包在一个函数中并排除所有副作用,例如别名,那么一个非常非常聪明的编译器可能会从中做出一些东西,但我们不是在谈论这个对吗?)

此外,数字大小(我假设您指的是十进制数字)并不重要。如果是单精度浮点数,则每个矩阵条目都由其 32 位的all 表示(如果是双精度浮点数,则由 64 位表示)。

© www.soinside.com 2019 - 2024. All rights reserved.