【发布时间】:2021-01-20 08:49:27
【问题描述】:
我有一个制作线性代数的 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) 慢?我的期望是,如果我们让原生库知道输入矩阵是对称的,它会给它一个提示,让它能够更快地求解线性系统。
顺便说一句,我检查了这 2 种方法是否给出了相同的数值结果。就是这样。
【问题讨论】:
标签: java lapack blas aws-batch jblas