我有一个制作线性代数的 Java 程序。我使用 jblas 库,根据我的理解,它应该调用实现 Blas 和 Lapack 的本机库以获得更快的结果。
此代码在 Docker 中运行并在 AWS Batch 托管作业中启动。
摘自 Dockerfile :
FROM debian:stretch
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install libgfortran3 # install fortran
RUN apt-get -y install openjdk-8-jdk # install java 8
我尝试提高对 24000 x 24000 平方对称矩阵求逆的速度。我看到 jblas 库提供了 2 种方法。一种用于使用本机dgesv程序进行通用线性系统求解,另一种用于使用本机dsysv程序进行对称矩阵求解。
DoubleMatrix A = ...; // my 24k symmetric square matrix
DoubleMatrix B = DoubleMatrix.eye(A.rows);// Identity matrix
DoubleMatrix C = Solve.solve(A, B);// takes 4020 s
DoubleMatrix D = Solve.solveSymmetric(A, B);// takes 5040 s, longer than the calculation of C
问题 1:当应该使用原生 Blas 和 Lapack 库时,求解 24k 方阵需要这么多时间是否正常?如果不是,如何提高在 AWS Batch 作业环境中运行时的速度?
问题 2:为什么求解对称 (dsysv) 比一般求解 (dgesv) 慢?我的期望是,如果我们让原生库知道输入矩阵是对称的,它会给它一个提示,让它能够更快地求解线性系统。
顺便说一句,我检查了这两种方法是否给出了相同的数值结果。情况就是这样。