2013-11-14 5 views
6

Мне нужно умножить большие матрицы размером от 5000x5000 до 20000x20000. У меня возникла проблема с поиском библиотеки с разреженными матрицами и тем не менее она может быстро размножаться.Медленная производительность умножения матрицы с использованием MTJ/Netlib (native)

Прежде всего, я прочитал предыдущий вопрос о производительности библиотек матриц Java (Performance of Java matrix math libraries?). Основываясь на главном ответе, я решил пойти с JBLAS, поскольку он был одним из самых быстрых. В моем случае потребовалось примерно 50 или около того, чтобы умножить матрицу 5000x5000, которая довольно много медленнее, чем Matlab, но все же переносима.

Проблема заключается в том, что матрицы могут быть довольно большими (до 20k на 20k или более), но они, как правило, разрежены. Только 30% элементов в матрице являются не нулями. JBLAS не обеспечивает реализацию разреженной матрицы, поэтому объем памяти, необходимый для хранения большой плотной матрицы, может стать весьма непостоянным. Я попытался переключиться на MTJ/Netlib, так как он должен быть одной из лучших библиотек в тесте, который имеет разреженную матрицу. Заметка здесь (https://github.com/fommil/netlib-java/) говорит, что для достижения максимальной производительности я должен скомпилировать собственный BLAS на моей машине. Поэтому я загрузил OpenBLAS, скомпилировал и установил его. Я также выполнить несколько команд, чтобы установить библиотеку OpenBLAS на Ubuntu 13.10:

$ cd ~/build/OpenBLAS 
$ make 
$ sudo make install PREFIX=/usr/local/openblas 
$ sudo cat "/usr/local/openblas/lib" > /etc/ld.so.conf.d/openblas.conf 
$ sudo ldconfig 
$ sudo update-alternatives --install /usr/lib/libblas.so.3 libblas.so.3 /usr/local/openblas/lib/libopenblas.so 90 
$ sudo update-alternatives --config libblas.so.3 

Я выбрал мой скомпилированные библиотеки OpenBLAS на последнем этапе обновление-альтернатив. Я предполагаю, что после этого Netlib собирает мою скомпилированную библиотеку OpenBLAS и использует ее. Я также провел некоторый тест от http://r.research.att.com/benchmarks/R-benchmark-25.R и наблюдал некоторое ускорение в предыдущем (используя blas по умолчанию из ubuntu) и после случая (используя мой скомпилированный OpenBLAS).

Однако матрица-матрица в MTJ все еще очень медленная. Например, у меня две матрицы A = 5824x5824, W = 5824x4782. Я умножать их, как это в Java

Matrix AW = new FlexCompRowMatrix(A.numRows(), W.numColumns()); 
A.mult(W, AW); 

код работает уже в течение более чем 45 минут, теперь достаточно набрать весь этот пост, и это все еще не закончили. Используя JBLAS, одно и то же матричное умножение займет менее 1 минуты. Есть что-то, что я пропустил?

Спасибо!

+0

Я также попробовал прекомпилированную многопоточную библиотеку OpenBLAS (http://www.personal.psu.edu/mar36/blogs/the_ubuntu_r_blog/2013/08/multi-threaded-openblas-backported-to-recent-ubuntu-releases. html), думая, что я испортил процесс компиляции. Но ничего не меняется, умножение матричной матрицы с использованием MTJ/Netlib все еще медленное.Возможно, вопрос в том, почему JBLAS может сделать это так (относительно) быстро, даже без меня вообще ничего не настроить? – x112341

+0

Могу ли я спросить, какова цель умножения матриц 20000x20000? Я не вижу никаких приложений с моими знаниями (пока). –

+0

Хорошо, 20k на 20k довольно растянуто. Тем не менее, матрица 5k на 5k вполне разумна, я думаю, и она работает вечно ... – x112341

ответ

6

JBLAS выполняет плотные операции матрицы. MJT делает и плотный, и разреженный. Использование «разреженных» матриц плотным образом медленное. FlexCompRowMatrix создает разреженную матрицу.

То, что вы хотите сделать, чтобы сравнить непосредственно JBLAS, является:

Matrix a = new DenseMatrix(5000,5000); 
Matrix b = new DenseMatrix(5000,5000); 
Matrix c = new DenseMatrix(5000,5000); 

a.multAdd(b, c); 

Производительность с помощью MJT + OpenBlas должна быть примерно такой же, как MatLab.

+0

только сопоставим с MATLAB, если MATLAB использует тот же blas/lapack под капотом ;-) Кстати, почему это не отмечено как ответ? – fommil

+0

@jwd, пожалуйста, отметьте это как ответ, это правильно. – fommil

+0

Автор библиотеки @fommil сказал, PLS отметить правильно. – javadba

0

см. http://jeshua.me/blog/NetlibJavaJNI и обратите внимание, что вам, возможно, придется обновить собственный пакет имена в тесте для демонстрации использования.

например, возможно, необходимо будет изменить: Класс javaBlasClass = Class.forName ("org.netlib.blas.JBLAS"); : Класс javaBlasClass = com.github.fommil.netlib.BLAS.class;

Смежные вопросы