我正在尝试在线找出一些矩阵乘法/反演基准。我的C ++实现目前可以在38秒内反转100 x 100矩阵,但与我发现的this基准测试相比,我的实现性能非常糟糕。我不知道它是否是一个超级优化的东西,或者你真的可以在大约0.11秒内轻松地反转200 x 200矩阵,所以我正在寻找更多的基准来比较结果。你上帝有一些很好的联系吗?
更新 我在我的乘法代码中发现了一个错误,它不会影响结果但会导致无用的循环浪费。现在我的反演在20秒内完成。这仍然是很多时间,任何想法都是受欢迎的。
谢谢大家
答案 0 :(得分:4)
这种操作对缓存非常敏感。您希望在L1&中的变量上完成大部分工作。二级缓存。查看本文档的第6部分:
http://people.redhat.com/drepper/cpumemory.pdf
他将引导您以缓存优化的方式优化矩阵乘法,并获得一些重大的性能提升。
答案 1 :(得分:3)
检查您是否按值传递巨大的矩阵对象(如果复制整个矩阵,这可能会很昂贵) 如果可以通过参考传递。
关于matricies和C ++的问题是你想尽可能避免复制 因此,您的主要对象可能不应该包含“矩阵数据”,而是包含有关矩阵的元数据和指针(由智能的东西包裹)到数据部分。因此,在复制对象时,您只复制一小块数据而不是整个对象(请参阅字符串实现示例)。
答案 2 :(得分:2)
为什么首先需要实现自己的矩阵库?正如您已经发现的那样,已经有非常高效的库可以做同样的事情。尽管人们喜欢将C ++视为一种表现语言,但只有当你真的擅长语言时才会这样。在C ++中编写非常慢的代码非常容易。
答案 3 :(得分:1)
我不知道它是否是超级优化的 什么或者如果你真的很容易 在大约中反转200 x 200矩阵 0.11秒
MATLAB也不会出汗。您是否正在实施矩阵求逆的LAPACK例程(例如LU分解)?
答案 4 :(得分:1)
您是否尝试过分析它?
遵循此paper(pdf),具有LU分解的100x100矩阵的计算将需要1348250(浮点运算)。核心2可以做大约20 Gflops(processor metrics)。所以从理论上讲,你可以在1毫秒内进行反演。
没有代码就很难断言是什么原因导致了大差距。根据我尝试微优化(如循环展开,缓存值,SEE,线程等)的经验,您只会获得加速,这最多只是您当前的常数因素(这对您来说足够了)。
但是如果你想要提高一个数量级的速度,你应该看看你的算法,也许你的LU分解实现有一个bug。另一个要看的地方是组织数据,尝试不同的组织,将行/列元素放在一起。
答案 5 :(得分:0)
答案 6 :(得分:0)
我实际上使用** double
**而不是** long double
** s获得了大约7秒的时间,但这并不是很大,因为我失去了一半的精度。