Использую ли я библиотеки 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 и т. Д.), Если вы хотите наилучшую производительность.

Вы используете общие библиотеки, которые должны быть написаны на Фортране.

Имейте в виду, что для большой матрицы не является необоснованным, что умножение требует времени.

Другие вопросы по тегам