c++ - 乘以 2 个相同/不同矩阵的性能

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

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

*问题:*

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

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

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

谢谢

最佳答案

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

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

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

关于c++ - 乘以 2 个相同/不同矩阵的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14110545/

相关文章:

链接器可以内联函数吗?

c# - 为什么 C# 编译器不允许接口(interface)中的私有(private)属性 setter ?

java - 异常: "Invalid action number found in internal parse table." Polyglot Exception

c++ - 为什么这个 while 循环不起作用?

c++ - 包含自定义文件列表的资源管理器样式 ListView

python - 是什么导致 symfit 出现此警告?

c# - 我可以强制编译器优化特定方法吗?

c++ - 有关C++中函数的默认返回类型的查询

c++ - 如何转换简历类型 :Mat

matlab - 如何在matlab中比较两个图像中的所有补丁?