Умножение многопоточных разреженных матриц в 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, но, кажется, ссылки мертвы и не очень хорошо задокументированы / нет отзывов? Есть альтернативы?

Похоже, это довольно серьезное ограничение функциональности неявного параллелизма, поскольку в вычислительно тяжелых задачах имеется множество разреженных матриц, и в этих случаях крайне желательна гиперзаходная функциональность.

Ответы на вопрос(3)

Ваш ответ на вопрос