【发布时间】: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