很少使用巨大的矩阵进行计算,而使用小矩阵进行大量计算

时间:2014-05-19 09:37:38

标签: java performance matrix

我正在研究一个拥有数千个矩阵计算的Java项目。但矩阵最多只有10x10个矩阵。

我想知道使用矩阵库或使用写简单函数(determinant()dotproduct()等是否更好。)因为当使用小矩阵时,建议不要使用库但是通过自定义函数执行操作。

我知道像JAMA这样的矩阵库在10000x10000矩阵左右时提供了高性能。

使用10000x10000矩阵进行5-6次计算,我使用10x10矩阵进行100000次计算。原始操作的数量几乎相同。

两种情况在性能方面是否相同?我应该把自己看作是在使用大型矩阵并使用库吗?

2 个答案:

答案 0 :(得分:3)

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

在我为手工编码4x4矩阵所做的测试中,最大的开销是将数据加载到L1缓存中,你如何做到这一点并不重要。对于3x3矩阵和更小的矩阵,它似乎确实产生了显着的差异。

答案 1 :(得分:2)

获得最大可能的速度(需要付出很多努力)

为了获得最大可能的速度,我建议编写一个使用矢量数学内在函数的C函数,例如Streaming SIMD Extensions (SSE)Advanced Vector Extensions (AVX)运算,以及多线程(例如通过OpenMP)。

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

没有太多努力的合理速度

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

  

我想知道使用矩阵库或使用写入是否更好   简单的函数(determinant(),dotproduct()等)因为小时候   使用矩阵,建议不要使用库,而是使用库   自定义函数的操作。

     

...

     

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

不,使用库并为数学编写自己的函数在性能方面不一样。您可以编写一个专门针对您的应用程序的更快的函数,但请考虑这一点:

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

您可能会发现Apache Commons Math库很有用。我鼓励您对Apache Commons Math和JAMA进行基准测试以选择最快的。