矩阵实施基准,我应该鞭打自己吗?

时间:2009-02-05 17:46:37

标签: c++ matrix benchmarking multiplication inversion

我正在尝试在线找出一些矩阵乘法/反演基准。我的C ++实现目前可以在38秒内反转100 x 100矩阵,但与我发现的this基准测试相比,我的实现性能非常糟糕。我不知道它是否是一个超级优化的东西,或者你真的可以在大约0.11秒内轻松地反转200 x 200矩阵,所以我正在寻找更多的基准来比较结果。你上帝有一些很好的联系吗?

更新 我在我的乘法代码中发现了一个错误,它不会影响结果但会导致无用的循环浪费。现在我的反演在20秒内完成。这仍然是很多时间,任何想法都是受欢迎的。

谢谢大家

7 个答案:

答案 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)

LINPACK基准测试基于求解线性代数问题。它们可用于不同的计算机和languages。也许他们也可以帮助你。

LINPACK C ++库也可用here

答案 6 :(得分:0)

我实际上使用** double **而不是** long double ** s获得了大约7秒的时间,但这并不是很大,因为我失去了一半的精度。