【问题标题】:performance of multiplying 2 identical/nonidentical matrix乘以 2 个相同/不同矩阵的性能
【发布时间】:2013-01-01 12:40:44
【问题描述】:

我正在对科学应用程序进行一些性能测试,并尝试考虑所有可能影响应用程序性能的因素(如缓存大小层次结构 cpu 速度......缓存线以及任何可能与性能有关的因素)。这个问题出现在我的脑海中,虽然它可能很愚蠢,但我想让它对我来说很明显。

*问题:*

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

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

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

谢谢

【问题讨论】:

  • 我强烈怀疑编译器会缓存这些值。另一方面,一些数学 API 可能。处理器甚至有可能(可能很小)。要进行基准测试,请运行足够多的时间或在足够大的矩阵上运行,这样实际上至少需要几秒钟,然后在性能检查之外填充矩阵。
  • 这就是高级优化比低级优化更重要的原因。如果你知道所有的值都相同,你可以将问题从 O(n^3) 减少到 O(n^2),而不管处理器有多聪明,它总是 O(n^3)如果你执行完全乘法。
  • 你的问题很笼统。能具体说一下具体情况吗?在这种一般情况下,几乎不可能提及整个堆栈中所有可能的优化。
  • 对于初学者,您使用什么库/API 来进行矩阵计算?
  • 在这种情况下,实际上使用库/API 来执行矩阵乘法并不重要。

标签: c++ optimization compiler-construction hardware compiler-optimization


【解决方案1】:

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

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

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

【讨论】:

  • 您可能是对的,但有一些警告。非常小的(非正规)数字处理起来可能非常慢,比如慢 100 倍;并且这样的数字实际上并不少见,特别是在迭代优化问题中,因为它们有时会收敛(某些系数)为零。同样,对 NaN 和 Inf 值的操作并不总是与对其他值的操作一样快。此外,一些运算(尽管我认为不是乘法和加法)在实际芯片上的实现中依赖于值,尽管我认为这种影响不会经常影响到任何人。
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 2016-10-06
  • 1970-01-01
  • 2022-11-12
  • 2021-06-09
相关资源
最近更新 更多