我正在研究一个拥有数千个矩阵计算的Java项目。但矩阵最多只有10x10
个矩阵。
我想知道使用矩阵库或使用写简单函数(determinant()
,dotproduct()
等是否更好。)因为当使用小矩阵时,建议不要使用库但是通过自定义函数执行操作。
我知道像JAMA这样的矩阵库在10000x10000
矩阵左右时提供了高性能。
使用10000x10000
矩阵进行5-6次计算,我使用10x10
矩阵进行100000次计算。原始操作的数量几乎相同。
两种情况在性能方面是否相同?我应该把自己看作是在使用大型矩阵并使用库吗?
答案 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进行基准测试以选择最快的。