zoukankan      html  css  js  c++  java
  • 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时,双线程反而令矩阵乘法效率降低。当矩阵更小时,是否多线程效率更好,我不能保证,应该要作更仔细的验算

  • 相关阅读:
    六:Vue之父子组件间的三种通信方式
    五:Vue之ElementUI 表格Table与分页Pagination组件化
    四:Vue之VUEX状态管理
    三:Vue之混入(mixin)与全局混入
    二:Vue之ElementUI Form表单校验
    一:Vue之开发环境搭建
    变了,说不出来的感觉。
    20180320作业2:进行代码复审训练
    20180320作业1:源代码管理工具调查
    15软工课后作业02-15100120
  • 原文地址:https://www.cnblogs.com/mfryf/p/2354283.html
Copyright © 2011-2022 走看看