我正在执行几个NxM稀疏(约1-2%)矩阵(称为B)和一个NxM密集矩阵(称为A,其中M < N)的矩阵乘法。N和M都很大,大约有数千个。我正在运行Matlab 2013a。
通常,在Matlab中,矩阵乘法和大多数其他矩阵操作隐式地并行化,即它们自动使用多个线程。如果两个矩阵中有任何一个是稀疏的,则似乎不是这种情况(请参见例如this StackOverflow discussion - 没有针对预期问题的答案 - 和 this largely unanswered MathWorks thread)。这对我来说是一个非常不愉快的惊喜。
我们可以通过以下代码验证多线程对稀疏矩阵操作没有影响:
这将产生以下输出,说明在稀疏操作中使用1、2和4个线程没有区别:
如果我将B替换为其密集形式(在上面称为Bf),则会显著提高速度:
(说明Matlab中稠密矩阵的矩阵运算确实是隐式并行化的)
所以,我的问题是:是否有任何方法可以在不将稀疏矩阵转换为密集形式的情况下访问并行化/线程化版本的矩阵操作(在Matlab中进行稀疏矩阵操作)? 我发现一个旧的建议涉及MathWorks的.mex文件, 但似乎链接已经失效,而且文档不太完整/没有反馈?有其他选择吗?
这似乎是隐式并行功能的一个相当严重的限制,因为稀疏矩阵在计算量大的问题中很常见,并且这些情况下高度渴望超线程功能。
通常,在Matlab中,矩阵乘法和大多数其他矩阵操作隐式地并行化,即它们自动使用多个线程。如果两个矩阵中有任何一个是稀疏的,则似乎不是这种情况(请参见例如this StackOverflow discussion - 没有针对预期问题的答案 - 和 this largely unanswered MathWorks thread)。这对我来说是一个非常不愉快的惊喜。
我们可以通过以下代码验证多线程对稀疏矩阵操作没有影响:
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中进行稀疏矩阵操作)? 我发现一个旧的建议涉及MathWorks的.mex文件, 但似乎链接已经失效,而且文档不太完整/没有反馈?有其他选择吗?
这似乎是隐式并行功能的一个相当严重的限制,因为稀疏矩阵在计算量大的问题中很常见,并且这些情况下高度渴望超线程功能。