Java 使用大型矩阵进行少量计算,而使用小型矩阵进行大量计算

Java 使用大型矩阵进行少量计算,而使用小型矩阵进行大量计算,java,performance,matrix,Java,Performance,Matrix,我正在从事一个Java项目,该项目有数千个矩阵计算。但是矩阵最多是10x10矩阵 我想知道是否最好使用矩阵库或使用编写简单函数(determinate(),dotproduct()等),因为当使用小矩阵时,建议不要使用库,而是通过自定义函数进行操作 我知道像JAMA这样的矩阵库在10000x1000矩阵等方面提供了高性能 我不是用10000x1000矩阵进行5-6次计算,而是用10x10矩阵进行100000次计算。基本操作的数量几乎相同 这两种情况在性能方面是否相同?我是否应该把自己当作是在处理

我正在从事一个Java项目,该项目有数千个矩阵计算。但是矩阵最多是
10x10
矩阵

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

我知道像JAMA这样的矩阵库在
10000x1000
矩阵等方面提供了高性能

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


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

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


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

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


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

获得最大可能的速度(非常努力)

为了获得尽可能快的速度,我建议编写一个C函数,该函数使用向量数学内部函数,例如or操作,以及多线程(例如通过OpenMP)

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

不费吹灰之力的合理速度

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

我想知道是使用矩阵库还是使用编写 简单函数(行列式()、点积()等),因为 如果使用了矩阵,建议不要使用库,而是执行以下操作: 自定义函数的操作

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

不,使用库和编写自己的数学函数在性能方面是不同的。您可以编写一个专门应用于您的应用程序的更快的函数,但请考虑如下:

  • 库函数的bug应该比您编写的代码少
  • 一个好的库将使用高效的实现(即最少的操作量)。你有时间研究和实施最有效的算法吗

你可能会发现这个图书馆很有用。我鼓励您对Apache Commons Math和JAMA进行基准测试,以选择最快的。

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

为了获得尽可能快的速度,我建议编写一个C函数,该函数使用向量数学内部函数,例如or操作,以及多线程(例如通过OpenMP)

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

不费吹灰之力的合理速度

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

我想知道是使用矩阵库还是使用编写 简单函数(行列式()、点积()等),因为 如果使用了矩阵,建议不要使用库,而是执行以下操作: 自定义函数的操作

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

不,使用库和编写自己的数学函数在性能方面是不同的。您可以编写一个专门应用于您的应用程序的更快的函数,但请考虑如下:

  • 库函数的bug应该比您编写的代码少
  • 一个好的库将使用高效的实现(即最少的操作量)。你有时间研究和实施最有效的算法吗

你可能会发现这个图书馆很有用。我鼓励您对Apache Commons Math和JAMA进行基准测试,以选择最快的。

您可能会对这个基准感兴趣:您正确地认为,为大n优化与为小n优化不同。你必须找出你的BLAS库对于小矩阵是否也是有效的。这个基准可能会让你感兴趣:你正确地认为,对大n和小n进行优化是不同的。你必须找出你的BLAS库对于小矩阵是否也是有效的。