1

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

更新 我在我的乘法代码中发现了一个错误,它不会影响结果,但会导致无用的循环浪费。现在我的反转在 20 秒内执行。时间还很长,欢迎提出任何想法。

谢谢各位

4

7 回答 7

4

这种操作对缓存非常敏感。您希望在 L1 和 L2 缓存中的变量上完成大部分工作。查看此文档的第 6 节:

http://people.redhat.com/drepper/cpumemory.pdf

他将引导您以缓存优化的方式优化矩阵乘法,并获得一些重大的性能改进。

于 2009-02-05T18:16:46.290 回答
3

检查您是否按值传递巨大的矩阵对象(因为如果复制整个矩阵,这可能会很昂贵)。
如果可能通过引用传递。

关于矩阵和 C++ 的事情是您希望尽可能避免复制。
因此,您的主要对象可能不应该包含“矩阵数据”,而是包含有关矩阵的元数据和指向数据部分的指针(由 somthing smart 包装)。因此,当复制一个对象时,您只复制一小块数据而不是整个数据(参见字符串实现示例)。

于 2009-02-05T18:11:48.093 回答
2

为什么首先需要实现自己的矩阵库?正如您已经发现的那样,已经有非常高效的库可以做同样的事情。尽管人们喜欢将 C++ 视为一种性能语言,但只有当你真的很擅长这种语言时,这才是正确的。用 C++ 编写非常慢的代码非常容易。

于 2009-02-05T18:16:24.497 回答
1

我不知道它是否是一个超级优化的东西,或者你是否真的可以在大约 0.11 秒内轻松地反转一个 200 x 200 矩阵

MATLAB 也毫不费力地做到了这一点。您是否正在执行矩阵求逆的LAPACK例程(例如 LU 分解)?

于 2009-02-05T18:04:15.600 回答
1

您是否尝试过对其进行分析?

根据本文(pdf),使用 LU 分解计算 100x100 矩阵将需要 1348250(浮点运算)。核心 2 可以执行大约 20 Gflops(处理器指标)。所以从理论上讲,你可以在 1 毫秒内进行反转。

如果没有代码,很难断言造成巨大差距的原因是什么。根据我尝试循环展开、缓存值、SEE、线程等微优化的经验,你只会得到加速,这充其量只是你当前的一个恒定因素(这对你来说可能已经足够了)。

但是如果你想要一个数量级的速度增加你应该看看你的算法,也许你的 LU 分解的实现有一个错误。另一个要看的地方是数据的组织,尝试不同的组织,将行/列元素放在一起。

于 2009-02-06T05:18:54.737 回答
0

LINPACK基准测试基于解决线性代数问题。它们可用于不同的机器和语言。也许他们也可以帮助你。

LINPACK C++ 库在这里也可用。

于 2009-02-05T17:51:24.033 回答
0

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

于 2009-02-05T18:02:02.513 回答