Использую ли я библиотеки BLAS / LAPACK при использовании MTJ?

Я не уверен, что это подходящее место, чтобы задать свой вопрос, поэтому, если нет, прошу прощения.

Я пишу программу на Java, которая выполняет много умножений разреженных матриц. После некоторого исследования я обнаружил, что Matrix Toolkits Java обеспечивает лучшую производительность , но только при использовании оболочки netlib-java для библиотек BLAS / LAPACK fortran.

Теперь я попробовал следовать инструкциям на этих страницах 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

Теперь моя программа умножает разреженную матрицу размером около 450 000x450 000 элементов на вектор. Это занимает около секунды. Я использую Intel Core 2 Duo @ 2,53 ГГц.

В конце концов, у меня вопрос: действительно ли я использую бэкэнд Fortran или все же Java-реализацию этих функций? Я понимаю, что мои вычисления велики, но я все же считаю, что они могут быть быстрее ... Есть ли способ проверить, какие библиотеки используются во время работы?

Заранее спасибо! С уважением,

Линус

РЕДАКТИРОВАТЬ:

Я только что попробовал кое-что, что, на мой взгляд, говорит о том, что я на самом деле НЕ использую библиотеки. Я переименовал и liblapack, и libblas, предполагая, что это сделает невозможным их поиск Java. Моя программа все еще работала после переименования библиотек и, что более важно, занимала столько же времени ... Думаю, сейчас я ищу, как убедиться, что библиотеки загружены и используются!


person Linus    schedule 11.03.2014    source источник
comment
Какие файлы переименовываете?   -  person riklund    schedule 11.03.2014
comment
/usr/lib/liblapack.so и /usr/lib/libblas.so   -  person Linus    schedule 11.03.2014


Ответы (2)


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

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

person riklund    schedule 11.03.2014
comment
Спасибо за ответ, но я хотел бы знать, как вы это узнали и можете ли вы объяснить мой небольшой эксперимент в моей новой редакции! - person Linus; 11.03.2014
comment
Если вы посмотрите документацию netlib-java, в ней говорится, что она использует библиотеки Fortran. - person riklund; 11.03.2014
comment
Хорошо, в этом случае мой вопрос заключается в том, использую ли я автономные собственные сборки или делегирующие сборки, которые используют оптимизированные для компьютера системные библиотеки. - person Linus; 11.03.2014

Есть простой способ проверить, какую версию библиотеки BLAS вы используете в своем коде:

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

Если вы используете собственную библиотеку, вы должны увидеть что-то вроде:

com.github.fommil.netlib.NativeSystemBLAS

Если, наоборот, вы все еще связаны с JBLAS, вы должны увидеть вместо этого ссылку на F2jBLAS или JBLAS.

С учетом сказанного вам все равно необходимо убедиться, что ваша системная библиотека BLAS связана с правильной реализацией (специально скомпилированный OpenBLAS, Intel MLK и т. Д.), Если вам нужна максимальная производительность.

person Matt Fortier    schedule 04.06.2015