Matlab多线程运算的问题

上次说到,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')

可得出下图。说明当矩阵大小约为2030时,双线程反而令矩阵乘法效率降低。当矩阵更小时,是否多线程效率更好,我不能保证,应该要作更仔细的验算。

本文转自博客园知识天地的博客,原文链接:Matlab多线程运算的问题,如需转载请自行联系原博主。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值