Мне нужно умножить большие матрицы размером от 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 минуты. Есть что-то, что я пропустил?
Спасибо!
Я также попробовал прекомпилированную многопоточную библиотеку 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
Могу ли я спросить, какова цель умножения матриц 20000x20000? Я не вижу никаких приложений с моими знаниями (пока). –
Хорошо, 20k на 20k довольно растянуто. Тем не менее, матрица 5k на 5k вполне разумна, я думаю, и она работает вечно ... – x112341