1

我正在对科学应用进行一些性能测试,并试图考虑所有可能影响应用程序性能的元素(如缓存大小层次结构CPU速度...缓存行以及以往可能与性能有关)。这个问题出现在我的脑海里,虽然它可能是愚蠢的,但我想让它变得很明显。性能乘以2相同/不相同的矩阵

* 问: *

,如果我不对指正please.cost处理整型和浮点或双精度数在处理器不同,这是因为使用CPU浮点单元(以计算浮点值)。现在我想知道在用相同的float或double值填充两个2d矩阵之间是否存在差异,然后将它们相乘或填充它们的随机float或double值,然后将它们相乘。剂量编译器使用缓存矩阵的所有元素具有相同的值?

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

二手机器英特尔E4500。 编译器g ++ 4.7。

感谢

+2

我非常怀疑编译器会缓存这些值。另一方面,一些数学API可能会。处理器甚至可能有(可能很小)的机会。要进行基准测试,请运行足够多的时间或足够长的矩阵,以便实际使用至少几秒钟,然后在性能检查之外填充矩阵。 – Dukeling

+1

这就是为什么高层优化比低层优化更重要的原因。如果你知道所有的值都是相同的,你可以将问题从O(n^3)减少到O(n^2),而无论处理器有多聪明,它总是O(n^3)如果你执行完整的乘法。 –

+0

你的问题真的很一般。你能更具体地了解情况吗?在这种一般情况下,在整个堆栈中提及所有可能的优化几乎是不可能的。 –

回答

2

你是正确的,整数和浮点运算的成本是不同的,但并不像人们可以承担。它高度依赖于哪个处理器单元用于计算。特别是对于英特尔处理器,您可以在http://www.intel.com/products/processor/manuals/的“优化参考手册”中找到有用的信息。附录C列出了所有指令的指令延迟。

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

此外,数字的大小(我假定你指的是十进制数字)并不重要。在单精度浮点数(或双精度情况下为64位)的情况下,每个矩阵项由其32位的全部表示。

+0

你可能是对的,但有几个警告。非常小(非正常)的数字可能非常缓慢地处理,例如慢100倍;并且这样的数字在迭代优化问题中实际上并不罕见,因为它们有时会将(某些系数)收敛到零。同样,NaN和Inf值上的operatiosn并不总是与其他值上的操作一样快。此外,一些操作(虽然不是,我相信,乘法和加法)在实际芯片上的实现取决于价值,尽管我不认为这种效应可能经常遇到任何人。 –