1

我不确定这是问我问题的正确地方,所以如果不是,我道歉。

我正在编写一个执行大量稀疏矩阵乘法的 Java 程序。经过一些研究,我发现Matrix Toolkits Java提供了一些最佳性能,但仅在使用BLAS/LAPACK fortran 库的netlib-java包装器时。

现在我尝试按照这些 github 页面上的说明进行操作,并且我已经从 Arch Linux 存储库安装了 BLAS 和 LAPACK:

$ pacman -Ss lapack
extra/lapack 3.5.0-1 [installed]
    Linear Algebra PACKage
$ pacman -Ss blas
extra/blas 3.5.0-1 [installed]
    Basic Linear Algebra Subprograms

检查 /usr/lib/ 时,它确实包含

-rwxr-xr-x 1 root root 1866088 Jan 27 21:46 liblapacke.so
lrwxrwxrwx 1 root root      13 Jan 27 21:46 liblapacke.so.3 -> liblapacke.so 
lrwxrwxrwx 1 root root      13 Jan 27 21:46 liblapacke.so.3.5.0 -> liblapacke.so
-rwxr-xr-x 1 root root 5878120 Jan 27 21:46 liblapack.so 
lrwxrwxrwx 1 root root      12 Jan 27 21:46 liblapack.so.3 -> liblapack.so
lrwxrwxrwx 1 root root      12 Jan 27 21:46 liblapack.so.3.5.0 -> liblapack.so

-rwxr-xr-x 1 root root 358448 Jan 27 21:46 libblas.so
lrwxrwxrwx 1 root root     10 Jan 27 21:46 libblas.so.3 -> libblas.so
lrwxrwxrwx 1 root root     10 Jan 27 21:46 libblas.so.3.5.0 -> libblas.so

现在,我的程序将一个包含大约 450,000x450,000 个元素的稀疏矩阵与一个向量相乘。这大约需要一秒钟。我在 Intel Core 2 Duo @ 2.53GHz 上运行。

毕竟我的问题是,我真的在使用 Fortran 后端,还是这些函数的 Java 实现?我意识到我的计算量很大,但我仍然觉得它们可以更快......有没有办法检查运行时使用了哪些库?

提前致谢!问候,

莱纳斯

编辑:

我刚刚尝试了一些东西,这对我来说表明我实际上并没有使用这些库。我已经重命名了 liblapack 和 libblas,假设这会使 Java 无法找到它们。我的程序在重命名库后仍然运行,更重要的是,花了同样长的时间......我想我现在正在寻找的是如何确保库加载并被使用!

4

2 回答 2

0

您正在使用应该用 Fortran 编写的共享库。

请记住,对于大型矩阵,乘法需要时间并不是不合理的。

于 2014-03-11T09:00:39.203 回答
0

有一种简单的方法可以检查您在代码中使用的 BLAS 库的版本:

System.out.println(BLAS.getInstance().getClass().getName());

如果您正在运行 Native 库,您应该会看到如下内容:

com.github.fommil.netlib.NativeSystemBLAS

相反,如果您仍然链接到 JBLAS,那么您应该看到对F2jBLAS或的引用JBLAS

话虽如此,如果您想要获得最佳性能,您仍然需要确保您的系统 BLAS 库链接到正确的实现(自定义编译的 OpenBLAS、英特尔 MLK 等)。

于 2015-06-04T06:53:22.880 回答