【发布时间】:2014-10-09 09:07:23
【问题描述】:
我正在执行 NxN 稀疏 (~1-2%) 矩阵的几次矩阵乘法,我们称之为 B,使用 NxM 密集矩阵,我们称之为 A(其中 M
现在,矩阵乘法和大多数其他矩阵运算通常在 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 中)的并行化/线程化版本的矩阵运算而不将它们转换为密集形式? 我找到了一个旧的suggestion involving .mex files at MathWorks,但似乎链接已经失效并且没有很好的记录/没有反馈?有其他选择吗?
这似乎是对隐式并行功能的相当严格的限制,因为稀疏矩阵存在大量计算量大的问题,并且在这些情况下非常需要超线程功能。
【问题讨论】:
-
@Yvon 在链接中,我看到了关于事情如何运作的一般描述,但我无法确定它与问题的相关性。
-
只是一个愚蠢的事后思考:它有助于使整个矩阵稀疏吗?
-
@DennisJaheruddin 它在加速方面有所帮助,但在内存方面并不实用。这就是问题的原因。
-
@Daniyar M 大的信息被格式问题隐藏,已编辑问题以解决此问题。 -- 尽管如此,从完整到稀疏应该只使矩阵存储两倍大,所以除非你接近内存限制,否则它可能是一个有趣的方法。
标签: multithreading matlab matrix-multiplication sparse-matrix