上次说到,Matlab R2006a开始使用Intel MKL,只要设好OMP_NUM_THREADS这个环境变量,即可以BLAS Level 3的运算在任意线程数下。然而,尽管设定的线程数和CPU核的数目相同,但这样也并不能保证能提升计算效率。主要的原因在于建立线程也是需要时间的。如果你的任务只要0.0001秒就能算完,但建立线程也要用0.0001秒,那就根本没有必要把该任务多线程化。
麻烦的是,当我们设定好环境变量OMP_NUM_THREADS后启动Matlab,那么这个进程运行的线程数就定下来了,不能中途改变。于是,我们没有办法根据具体问题随时改变使用的线程数,使得在我们的程序中,能提升某部份的效率,但另一部份的效率却可能降低。
我们可以对矩阵乘法做一点测试,在不同的线性数下,看看不同的矩阵大小,其乘法的效率如何。首先编写程序如下:
THREADS = 2; % 线程数
N = 2000000; % N / 矩阵大小 = 每种维度的矩阵要做乘法的次数
% 设定测试的矩阵大小
MN = 50;
step = 2;
x = 10 : step : MN;
n = max(size(x));
T = zeros(2, n); % 用作存放结果
for i = 1 : n
M1 = zeros(x(i));
M2 = zeros(x(i));
M1 = rand(x(i));
M2 = rand(x(i));
t = cputime; % 准备计时
for j = 1 : N / x(i) % 令计算次数随矩阵增大而减少
tmp = M1 * M2;
end
T(:, i) = [x(i) (cputime - t) / THREADS]; % 存放结果
end
可以在不同线程下计算,把T存起来。接着可以比较单线程下的计算结果T1和双线程下计算的结果T2,有:
>> T = T1(2, :) ./ T2(2, :);
>> plot(T1(1, :), T, 'k')
麻烦的是,当我们设定好环境变量OMP_NUM_THREADS后启动Matlab,那么这个进程运行的线程数就定下来了,不能中途改变。于是,我们没有办法根据具体问题随时改变使用的线程数,使得在我们的程序中,能提升某部份的效率,但另一部份的效率却可能降低。
我们可以对矩阵乘法做一点测试,在不同的线性数下,看看不同的矩阵大小,其乘法的效率如何。首先编写程序如下:
THREADS = 2; % 线程数
N = 2000000; % N / 矩阵大小 = 每种维度的矩阵要做乘法的次数
% 设定测试的矩阵大小
MN = 50;
step = 2;
x = 10 : step : MN;
n = max(size(x));
T = zeros(2, n); % 用作存放结果
for i = 1 : n
M1 = zeros(x(i));
M2 = zeros(x(i));
M1 = rand(x(i));
M2 = rand(x(i));
t = cputime; % 准备计时
for j = 1 : N / x(i) % 令计算次数随矩阵增大而减少
tmp = M1 * M2;
end
T(:, i) = [x(i) (cputime - t) / THREADS]; % 存放结果
end
可以在不同线程下计算,把T存起来。接着可以比较单线程下的计算结果T1和双线程下计算的结果T2,有:
>> T = T1(2, :) ./ T2(2, :);
>> plot(T1(1, :), T, 'k')
可得出下图。说明当矩阵大小约为20到30时,双线程反而令矩阵乘法效率降低。当矩阵更小时,是否多线程效率更好,我不能保证,应该要作更仔细的验算。
本文转自博客园知识天地的博客,原文链接:Matlab多线程运算的问题,如需转载请自行联系原博主。