Умножение многопоточных разреженных матриц в Matlab
Я выполняю несколько умножений матриц матрицы NxN разреженной (~ 1-2%), назовем ее B, с плотной матрицей NxM, назовем ее A (где M <N). N большое, как и М; порядка нескольких тысяч. Я бегу Matlab 2013a.
Теперь обычно умножение матриц и большинство других матричных операций неявно распараллеливаются в Matlab, то есть они автоматически используют несколько потоков. Похоже, что это НЕ тот случай, если одна из матриц разрежена (см., Например,это обсуждение StackOverflow - без ответа на заданный вопрос - иэто в значительной степени неотвеченный поток MathWorks). Это довольно неприятный сюрприз для меня.
Мы можем проверить, что многопоточность не влияет на операции с разреженными матрицами, с помощью следующего кода:
clc; clear all;
N = 5000; % set matrix sizes
M = 3000;
A = randn(N,M); % create dense random matrices
B = sprand(N,N,0.015); % create sparse random matrix
Bf = full(B); %create a dense form of the otherwise sparse matrix B
for i=1:3 % test for 1, 2, and 4 threads
m(i) = 2^(i-1);
maxNumCompThreads(m(i)); % set the thread count available to Matlab
tic % starts timer
y = B*A;
walltime(i) = toc; % wall clock time
speedup(i) = walltime(1)/walltime(i);
end
% display number of threads vs. speed up relative to just a single thread
[m',speedup']
Это приводит к следующему выводу, который показывает, что нет разницы между использованием 1, 2 и 4 потоков для разреженных операций:
threads speedup
1.0000 1.0000
2.0000 0.9950
4.0000 1.0155
Если, с другой стороны, я заменяю B его плотной формой, называемой выше Bf, я получаю значительное ускорение:
threads speedup
1.0000 1.0000
2.0000 1.8894
4.0000 3.4841
(иллюстрируя, что матричные операции для плотных матриц в Matlab действительно неявно распараллеливаются)
Итак, мой вопрос: есть ли вообще способ получить доступ к параллельной / многопоточной версии матричных операций для разреженных матриц (в Matlab) без преобразования их в плотную форму? Я нашел один старыйпредложение с участием файлов .mex на MathWorks, но, кажется, ссылки мертвы и не очень хорошо задокументированы / нет отзывов? Есть альтернативы?
Похоже, это довольно серьезное ограничение функциональности неявного параллелизма, поскольку в вычислительно тяжелых задачах имеется множество разреженных матриц, и в этих случаях крайне желательна гиперзаходная функциональность.