我正在做一个Java项目,它有数千个矩阵计算。但这些矩阵最多都是10x10矩阵。
我想知道是否最好使用矩阵库或使用编写简单的函数(determinant()、dotproduct()等)。因为当使用小矩阵时,建议不要使用库,而是通过自定义函数进行操作。
我知道像JAMA这样的矩阵库在涉及10000x10000矩阵时提供了高性能。
我用10000x10000矩阵进行5-6次计算,用10x10矩阵进行100000次计算.基本操作的数量几乎相同。
这两种情况在性能方面是否相同?我应该把自己当作是在处理大型矩阵并使用库吗?
发布于 2014-05-19 10:13:24
我怀疑10x10矩阵,你不会看到太大的差别。
在我为手工编写4x4矩阵所做的测试中,最大的开销是将数据加载到L1缓存中,而如何做到这一点并不重要。对于3x3矩阵和更小的矩阵,它确实产生了显著的差异。
发布于 2014-05-19 10:47:09
获得最大可能的速度(付出很大的努力)
为了达到最大的速度,我建议编写一个C函数,它使用向量数学本质,比如流SIMD扩展(SSE)或高级矢量扩展(AVX)操作,以及多线程(例如通过OpenMP)。
您的Java程序将将所有100 k矩阵传递给这个本机函数,然后该函数将处理所有计算。可移植性成为一个问题,例如AVX指令只支持最近的CPU。开发人员的工作,特别是如果您不熟悉SSE/AVX,也会增加很多。
的合理速度不需要太多的努力
您应该通过创建扩展java.lang.Thread或实现java.lang.Runnable的类来使用多个线程。每个线程遍历矩阵的子集,为每个矩阵调用您的数学例程。这部分是在多核CPU上获得良好速度的关键.数学可以是您自己的Java函数来在单个矩阵上进行计算,或者您可以使用库的函数。
我想知道是否最好使用矩阵库或使用编写简单函数(行列式()、dotproduct()等)。因为当使用小矩阵时,建议不要使用库,而是通过自定义函数进行操作。 ..。 这两种情况在性能方面是否相同?我应该把自己当作是在处理大型矩阵并使用库吗?
不,使用库和为数学编写自己的函数是不同的表现。您可能会编写一个专门针对您的应用程序的更快的函数,但请考虑以下几点:
您可能会发现Apache Commons Math库很有用。我鼓励您对和JAMA进行基准测试,选择最快的。
https://stackoverflow.com/questions/23734393
复制相似问题