2014-05-19 107 views
1

我正在研究一个具有数千矩阵计算的Java项目。但矩阵至多是10x10矩阵。很少用巨矩阵计算与用小矩阵进行大量计算

我不知道是使用矩阵库还是使用写简单函数(determinant(),dotproduct()等),因为使用小型矩阵时,建议不要使用库,而是通过自定义函数执行操作。

我知道矩阵库如JAMA在涉及10000x10000矩阵等方面提供了高性能。

取而代之用10000x10000矩阵进行5-6计算,我用10x10矩阵进行了100000次计算。基本操作的数量几乎相同。

这两种情况在性能上是否相同?我应该如何对待自己,就像我在处理巨大的矩阵并使用图书馆一样?

+1

这个基准可能会让你感兴趣:https://code.google.com/p/java-matrix-benchmark/wiki/RuntimePerformanceBenchmark – Julien

+0

你认为大n的优化与小n不一样是正确的。你必须找出你的BLAS库是否对小型矩阵有效。 –

回答

3

我怀疑10x10矩阵,你不会看到太多的差异。

在手动编码4x4矩阵的测试中,最大的开销是将数据加载到L1缓存中,以及如何做到这一点并不重要。对于一个3x3矩阵而言,它看起来确实有很大的不同。

2

多线程获取最大可能的速度(有很多的心血)

为了获得最大可能的速度,我建议编写使用矢量数学内部函数,如Streaming SIMD Extensions (SSE)Advanced Vector Extensions (AVX)操作的C函数,在一起(例如,通过OpenMP的)。

您的Java程序会将所有100k矩阵传递给这个本地函数,然后处理所有的计算。便携性成为一个问题,例如AVX指令仅在最新的CPU上受支持。开发人员的努力,特别是如果你不熟悉SSE/AVX增加太多。

合理的速度没有太多精力

你应该通过创建一个扩展java.lang.Thread或实现java.lang.Runnable类使用多个线程。每个线程遍历矩阵的一个子集,为每个矩阵调用你的数学例程。这部分是在多核CPU上获得体面的速度的关键。数学可以是您自己的Java函数,可以在单个矩阵上进行计算,也可以使用库的函数。

不知是否是最好使用矩阵库或使用写入 简单的函数(行列式(),dotproduct()等),因为,当使用小 矩阵,建议不使用库但通过自定义函数执行 操作。

...

这两种情况在性能上是否相同?如果我正在处理巨大的矩阵并使用库,我应该把自己当作 吗?

不,使用库和编写自己的数学函数在性能方面并不相同。您可能能够编写专用于您的应用程序的更快功能,但请考虑:

  • 库函数应比您要编写的代码具有更少的错误。
  • 一个好的库将使用高效的实现(即最少量的操作)。你有没有时间研究和实现最有效的算法?

您可能会发现Apache Commons Math库有用。我鼓励你以Apache Commons Math和JAMA为基准来选择最快的。