Использую ли я библиотеки BLAS/LAPACK при использовании MTJ?
Я не уверен, что это правильное место, чтобы задать мой вопрос, так что если нет, я прошу прощения.
Я пишу программу на Java, которая выполняет много разумных умножений матриц. После некоторых исследований я обнаружил, что Java Matrix Toolkits обеспечивает лучшую производительность, но только при использовании оболочки netlib-java для библиотек фортрана BLAS/LAPACK.
Теперь я попробовал следовать инструкциям на этих страницах github и установил BLAS и LAPACK из репозиториев Arch Linux:
$ 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
Теперь моя программа умножает разреженную матрицу из 450000x450000 элементов на вектор. Это займет около секунды. Я работаю на Intel Core 2 Duo @ 2,53 ГГц.
После всего этого у меня возникает вопрос: действительно ли я использую бэкэнд на Фортране или все еще реализую эти функции на Java? Я понимаю, что мои вычисления большие, но я все еще чувствую, что они могут быть быстрее... Есть ли способ проверить, какие библиотеки используются во время работы?
Заранее спасибо! С Уважением,
Линус
РЕДАКТИРОВАТЬ:
Я только что попробовал что-то, что для меня предполагает, что я на самом деле не использую библиотеки. Я переименовал и liblapack, и libblas, предполагая, что это сделает невозможным их обнаружение в Java. Моя программа все еще работала после переименования библиотек и, что более важно, заняла столько же времени... Я думаю, что сейчас я ищу, как убедиться, что библиотеки загружены и используются!
2 ответа
Существует простой способ проверить, какую версию библиотеки BLAS вы используете в своем коде:
System.out.println(BLAS.getInstance().getClass().getName());
Если вы используете библиотеку Native, вы должны увидеть что-то вроде:
com.github.fommil.netlib.NativeSystemBLAS
Если, наоборот, вы все еще связаны с JBLAS, то вместо этого вы должны увидеть ссылку на F2jBLAS
или же JBLAS
С учетом вышесказанного вам все равно нужно убедиться, что ваша библиотека BLAS sysmtem связана с правильной реализацией (скомпилированная на заказ OpenBLAS, Intel MLK и т. Д.), Если вы хотите наилучшую производительность.
Вы используете общие библиотеки, которые должны быть написаны на Фортране.
Имейте в виду, что для большой матрицы не является необоснованным, что умножение требует времени.