【问题标题】:Few calculations with huge matrices vs. lots of calculations with small matrices大矩阵的少量计算与小矩阵的大量计算
【发布时间】:2014-05-19 09:37:37
【问题描述】:

我正在开发一个包含数千个矩阵计算的 Java 项目。但矩阵最多是10x10 矩阵。

不知道是用矩阵库好还是用写简单的函数好(determinant(),dotproduct()等)因为使用小矩阵时,建议不要使用库,而是通过以下方式进行操作自定义函数。

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

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

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

【问题讨论】:

标签: java performance matrix


【解决方案1】:

我怀疑对于 10x10 矩阵,您不会看到太大差异。

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

【讨论】:

    【解决方案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 进行基准测试,以选择最快的。

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 2017-06-14
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多