精华内容
下载资源
问答
  • MATLAB并行运算和分布式运算的基本操作-解MATLAB并行运算和分布式运算的基本操作.pdf 这个文档给大家介绍如何在实验室搭建分布式运算平台,及其配置。第一次给大家分享资源,但还不太熟悉怎么操作,大家见谅。
  • matlab_集群搭建及使用.pdf MATLAB并行计算简介(是几个机子并行的).ppt MATLAB并行运算和分布式运算的基本操作-图解.pdf 家庭云服务器高阶应用:通过Matlab分布式计算....DIYPCs.pdf
  • Matlab并行计算.rar

    2020-05-15 16:45:28
    Matlab并行计算(MATLAB分布式运算引擎)和Parallel Computing Toolbox™(并行计算工具箱),充分利用计算机集群的硬件资源来加速你的MATLAB应用程序。
  • matlab并行加速.zip

    2019-10-16 09:55:42
    matlab并行加速.zip
  • 2015b版本Matlab带的并行计算工具箱的完全参考手册
  • Matlab并行编程方法

    2021-05-08 15:05:11
    本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行。分为以下几个板块:怎么并行?parfor vs. SPMD注意事项及经验总结如何并行?Request a number of workers;Issue the ...

    本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行。分为以下几个板块:

    怎么并行?

    parfor vs. SPMD

    注意事项及经验总结

    如何并行?

    Request a number of workers;

    Issue the normal command to run the program. The client program will call on the workers as needed;

    Release the workers;

    具体到代码:

    matlabpool local 2;

    %parallel program

    matlabpool close

    其中2是core数目,注意2是core数。你的电脑如果是双核四线程的,那么只能申两个(而非4个)matlab local pool。

    具体实现parallel program呢,主要是通过parfor(parallel for)和SPMD(single program, multiple data)完成的。

    parfor vs. SPMD

    2.1 什么时候用parfor

    parfor只用于matlab并行循环。当你需要简单计算的多次循环迭代时,例如蒙特卡洛(Monte Carlo)模拟,parfor循环就很有用。parfor将循环迭代分组,那么每个worker执行迭代的一部分。当迭代耗时很长的时候parfor循环也是有用的,因为workers可以同时执行迭代。

    注意当循环中有迭代依赖其他迭代的结果时不应该使用parfor循环。每个迭代都必须不依赖其他迭代。由于parfor循环内有通信消耗,当只有小数量的简单计算时使用parfor可能得不到什么好处。

    c = 1:10;

    a = ones(10,1);

    tic

    parfor i = 1:length©

    a(i)= a(i)+ c(i);

    end

    toc

    fprintf(’%d\n’,a);

    2.2 什么时候用SPMD(Single Program/Multiple Data)单程序多任务进行任务并行

    Spmd中的“Single program”方面指的是同一段代码运行在不同的多个lab上。你在一个Matlab客户端上运行一个程序,被标志为spmd模块的其他部分运行在其他lab上。当这些块运行完毕后,你的程序继续在客户端运行。 “Multiple data”方面指的是虽然spmd语句在所有的lab上运行相同的代码,但每一个lab可以有不同的,独有的数据。所以多数据集可以在多个lab上同时被容纳。一下是我总结的SPMD使用的两个场景:

    The “single program” aspect of spmd means that the identical code runs on multiple labs. 就是说同一段程序应用于不同的样本(数据),所以一般针对随机抽样的并行,如

    %% SPMD

    %example 1

    spmd

    A = rand(3,2); %generate a matrix A for each lab(worker)

    end

    for i = 1:length(A)

    figure; imagesc(A{i});

    end

    %example 2

    a = 3;

    b = 4;

    spmd

    c = labindex();

    d = c+a;

    end

    c{2} = 5;

    spmd

    f = c*b;

    end

    for i = 1:length(f)

    fprintf(’%d\t’,f{i});%access the value of each lab

    end

    另外,SPMD也可以用于可替代parfor的块并行,在不同lab(worker)上对相同或不同的数据执行不同的并行操作,说起来有些拗口,具体看一下例子就明白了,下面我写的example3,4分别针对在不同lab上对相同数据和不同数据执行不同操作。它们都可以用parfor代替,对吧,这里我就不写了,相信大家的能力。。

    %example3 - deal with same Data by different parameters

    %add different values to same array Data

    Data = 1:100;

    spmd

    switch labindex

    case 1

    Data = Data+1;

    case 2

    Data = Data+2;

    end

    end

    % print Data{1} & Data{2} for checking

    %example4

    %add different values for different parts of array Data

    % [1:50]+1

    % [51:100]+2

    spmd

    if labindex == 1

    Data(1:50) = Data(1:50)+1;

    else

    Data(51:100) = Data(51:100)+2;

    end

    end

    以上是我对spmd和parfor的理解,欢迎补充指正,其他关于spmd vs. parfor的可以参考这个帖子。

    2.3 Composite类型

    spmd中每个lab返回值以composite存储,如上面[code]example 1中的f就是以composite的形式展现。f{i}为第i个lab的返回值。最开始我们也可以创建Composite对象并进行初始化赋值。

    f = Composite(2);

    注意事项及经验总结

    注意事项:

    parfor中慎用(最好勿用)eval幅值。

    一个程序并行时要共享内存,而eval语句可能使程序进入错误的workspace,因此不要用eval,改用不同index赋值。

    matlabpool local 2;

    c = 1:5;

    parfor i = 1:length©

    a(i) = c(i);

    end

    parfor循环不能很好利用所有处理器怎么办?

    是这样,

    parfor i = 1:4

    end

    就只能用4个处理器,而如果不加这个parfor可能matlab自身的负载均衡能够更好地利用CPU。这里我是开起来3个matlab,比如服务器上有12个核。我就给每个matlab分配4个core(>>matlabpool local 4),每个程序里有一个parfor i = 1:4. 这样就可以用起来12个核。我知道这样好暴力……囧,有人知道正解的话指条明路吧。。

    parfor,spmd不可以相互或者自身嵌套。

    parfor使用有很多约束,比如for循环内的表达式需要显式表达(透明性),不依赖前项。如

    parfor i = 3:10

    f(i) = f(i-1)+f(i-2);

    end

    是不行滴。。

    欢迎留言其他并行技巧和方法,谢谢!

    Reference:

    MATLAB官网——Parallel Computing Toolbox

    详细讲解并行用法(貌似阿拉伯人写的……o(╯□╰)o)

    详细并行代码

    多核计算平台中MATLAB并行计算

    Parallel Computing Toolbox User’s Guide

    如何并行?

    Request a number of workers;

    Issue the normal command to run the program. The client program will call on the workers as needed;

    Release the workers;

    具体到代码:

    matlabpool local 2;

    %parallel program

    matlabpool close

    其中2是core数目,注意2是core数。你的电脑如果是双核四线程的,那么只能申两个(而非4个)matlab local pool。

    具体实现parallel program呢,主要是通过parfor(parallel for)和SPMD(single program, multiple data)完成的。

    parfor vs. SPMD

    2.1 什么时候用parfor

    parfor只用于matlab并行循环。当你需要简单计算的多次循环迭代时,例如蒙特卡洛(Monte Carlo)模拟,parfor循环就很有用。parfor将循环迭代分组,那么每个worker执行迭代的一部分。当迭代耗时很长的时候parfor循环也是有用的,因为workers可以同时执行迭代。

    注意当循环中有迭代依赖其他迭代的结果时不应该使用parfor循环。每个迭代都必须不依赖其他迭代。由于parfor循环内有通信消耗,当只有小数量的简单计算时使用parfor可能得不到什么好处。

    c = 1:10;

    a = ones(10,1);

    tic

    parfor i = 1:length©

    a(i)= a(i)+ c(i);

    end

    toc

    fprintf(’%d\n’,a);

    2.2 什么时候用SPMD(Single Program/Multiple Data)单程序多任务进行任务并行

    Spmd中的“Single program”方面指的是同一段代码运行在不同的多个lab上。你在一个Matlab客户端上运行一个程序,被标志为spmd模块的其他部分运行在其他lab上。当这些块运行完毕后,你的程序继续在客户端运行。 “Multiple data”方面指的是虽然spmd语句在所有的lab上运行相同的代码,但每一个lab可以有不同的,独有的数据。所以多数据集可以在多个lab上同时被容纳。一下是我总结的SPMD使用的两个场景:

    The “single program” aspect of spmd means that the identical code runs on multiple labs. 就是说同一段程序应用于不同的样本(数据),所以一般针对随机抽样的并行,如

    %% SPMD

    %example 1

    spmd

    A = rand(3,2); %generate a matrix A for each lab(worker)

    end

    for i = 1:length(A)

    figure; imagesc(A{i});

    end

    %example 2

    a = 3;

    b = 4;

    spmd

    c = labindex();

    d = c+a;

    end

    c{2} = 5;

    spmd

    f = c*b;

    end

    for i = 1:length(f)

    fprintf(’%d\t’,f{i});%access the value of each lab

    end

    另外,SPMD也可以用于可替代parfor的块并行,在不同lab(worker)上对相同或不同的数据执行不同的并行操作,说起来有些拗口,具体看一下例子就明白了,下面我写的example3,4分别针对在不同lab上对相同数据和不同数据执行不同操作。它们都可以用parfor代替,对吧,这里我就不写了,相信大家的能力。。

    %example3 - deal with same Data by different parameters

    %add different values to same array Data

    Data = 1:100;

    spmd

    switch labindex

    case 1

    Data = Data+1;

    case 2

    Data = Data+2;

    end

    end

    % print Data{1} & Data{2} for checking

    %example4

    %add different values for different parts of array Data

    % [1:50]+1

    % [51:100]+2

    spmd

    if labindex == 1

    Data(1:50) = Data(1:50)+1;

    else

    Data(51:100) = Data(51:100)+2;

    end

    end

    以上是我对spmd和parfor的理解,欢迎补充指正,其他关于spmd vs. parfor的可以参考这个帖子。

    2.3 Composite类型

    spmd中每个lab返回值以composite存储,如上面[code]example 1中的f就是以composite的形式展现。f{i}为第i个lab的返回值。最开始我们也可以创建Composite对象并进行初始化赋值。

    f = Composite(2);

    注意事项及经验总结

    注意事项:

    parfor中慎用(最好勿用)eval幅值。

    一个程序并行时要共享内存,而eval语句可能使程序进入错误的workspace,因此不要用eval,改用不同index赋值。

    matlabpool local 2;

    c = 1:5;

    parfor i = 1:length©

    a(i) = c(i);

    end

    parfor循环不能很好利用所有处理器怎么办?

    是这样,

    parfor i = 1:4

    end

    就只能用4个处理器,而如果不加这个parfor可能matlab自身的负载均衡能够更好地利用CPU。这里我是开起来3个matlab,比如服务器上有12个核。我就给每个matlab分配4个core(>>matlabpool local 4),每个程序里有一个parfor i = 1:4. 这样就可以用起来12个核。我知道这样好暴力……囧,有人知道正解的话指条明路吧。。

    parfor,spmd不可以相互或者自身嵌套。

    parfor使用有很多约束,比如for循环内的表达式需要显式表达(透明性),不依赖前项。如

    parfor i = 3:10

    f(i) = f(i-1)+f(i-2);

    end

    是不行滴。。

    欢迎留言其他并行技巧和方法,谢谢!

    Reference:

    MATLAB官网——Parallel Computing Toolbox

    详细讲解并行用法(貌似阿拉伯人写的……o(╯□╰)o)

    详细并行代码

    多核计算平台中MATLAB并行计算

    Parallel Computing Toolbox User’s Guide

    展开全文
  • Matlab并行计算(新手)

    千次阅读 多人点赞 2020-10-22 18:11:46
    1 开启并行池–parpool 将以下代码存储为m文件,运行 p=parpool(3); i=1:100000; j=1:100000; Y=0; parfor i=1:100000 for j=1:1:100000 Y=Y+i+j; end end delete(p); 命令行会显示 >> test_parallel &...

    1 Matlab不会自动开启多核并行

    将以下代码存储为m文件,运行

    i=1:100000;
    j=1:100000;
    Y=0;
    for i=1:100000
        for j=1:1:100000
            Y=Y+i+j;
        end    
    end
    

    CPU占用情况为:只运行了一个matlab.exe
    在这里插入图片描述

    2 Matlab并行过程——parpool

    1. Request a number of workers;
    p=parpool(3);
    
    1. Issue the normal command to run the program. The client program will call on the workers as needed;
    i=1:100000;
    j=1:100000;
    Y=0;
    parfor i=1:100000
        for j=1:1:100000
            Y=Y+i+j;
        end    
    end
    
    1. Release the workers;
    delete(p);
    

    说明:最新几版的Matlab可以将并行处理的工具包 parallel pool自动打开,不需要再去格外开启,只需要将for改为parfor。

    但是我们这里还是进行开启和关闭partool,将以上代码存储为m文件,运行

    p=parpool(3);
    i=1:100000;
    j=1:100000;
    Y=0;
    parfor i=1:100000
        for j=1:1:100000
            Y=Y+i+j;
        end    
    end
    delete(p);
    

    命令行会显示

    >> test_parallel
    Starting parallel pool (parpool) using the 'local' profile ... connected to 3 workers.
    

    CPU占用情况为:
    在这里插入图片描述

    发现虽然开启了3个parpool,但是共有4个matlab.exe在运行。其中1个应该是主控的,它基本不干活,只负责分配,进行计算时他的cpu占用率只有1~2%,其他3个进程是专门用来计算的。

    若在代码开头不开启partool,只将for改为parfor,则CPU占用情况为:

    在这里插入图片描述
    发现开启了5个进程,其中4个进程占用情况类似。推测如果不用parfor可能matlab自身的负载均衡能够更好地利用CPU(?)。若服务器有12个core,比较暴力的做法是开3个matlab,将循环分成3部分,给每个matlab分配4个core(>>matlabpool local 4),每个程序里有一个parfor i = 1:4. 这样就可以用12个核。

    3 电脑核数与parpool的关系

    我的电脑是4核8线程
    在这里插入图片描述
    若将开头代码改为

    p=parpool(7);
    

    则会出现报错:

    >> test_parallel
    Starting parallel pool (parpool) using the 'local' profile ... 错误使用 parpool (line 103)
    You requested a minimum of 7 workers, but the cluster "local" has the NumWorkers property set to
    allow a maximum of 4 workers. To run a communicating job on more workers than this (up to a
    maximum of 512 for the Local cluster), increase the value of the NumWorkers property for the
    cluster. The default value of NumWorkers for a Local cluster is the number of cores on the local
    machine.
    
    出错 test_parallel (line 1)
    parpool(7);
    

    若改为

    p=parpool(5);
    

    也不行

    改为

    p=parpool(4);
    

    可以运行,这时开启了5个进程:

    在这里插入图片描述
    说明四核八线程的电脑只能申4个(而非8个)matlab local pool

    4 说明——matlabpool与partool

    在以前版本的matlab中,开启多线程池用的命令是matlabpool,例如:

    matlabpool('open',8);
    

    这一步是想开启8线程的线程池,但是从R2013b(具体版本不是很确定)开始,parpool命令取代了matlabpool命令

    在以前版本的matlab中,若运行:

    matlabpool local 4;  
        %parallel program  
    matlabpool close  
    

    其中4是core数目,如果是四核八线程的电脑,那么只能申4个(而非8个)matlab local pool

    5 并行实现——parfor或SPMD

    说明:开启并行计算的前提是,每一次循环不依赖上一次循环的结果。

    下列代码是不可取的:

    parfor i = 3:10
           f(i) = f(i-1)+f(i-2);
    end
    

    5.1 parfor(parallel for)

    当只需要简单计算的多次循环迭代时,例如蒙特卡洛(Monte Carlo)模拟,parfor很有用。它将循环迭代分组,每个worker执行迭代的一部分。当迭代耗时很长的时候parfor也是有用的,因为许多worker可以同时执行迭代。

    若计算量较小较简单,则不推荐使用parfor。因为parfor内有通信消耗,使用parfor可能不会使得通信时间缩短。

    parfor循环中不能使用迭代或者关联性的赋值语句,因为多个核计算时无法交换数据。

    parfor循环要求:

    1. 任务间必须独立
    2. 循环间次序独立

    循环体的限制:

    1. 不能引入变量(eg.eval,load,global,etc.)
    2. 不能含有break或return声明
    3. 不能嵌套另外的parfor循环

    一个程序并行时要共享内存,而eval语句可能使程序进入错误的workspace,因此不要用eval,改用不同index赋值。

    matlabpool local 2;  
    c = 1:5;  
    parfor i = 1:length(c)  
        a(i) = c(i);  
    end
    

    对于双重循环,由于不能写两个parfor,有两种解决方案:

    1. 将其中一个for改成parfor
    2. 利用meshgrid将双循环代码改为单循环,例如:
    parfor i = 1:100000
       parfor j = 1:100000
      	      y(i,j) = i+j;
       end
    end
    

    会报错,可以修改为:

    i = 1:100000;
    j = 1:100000;
    [I,J] = meshgrid(i,j);
    parfor i = 1:numel(I)
        Y(i) = I(i)+J(i);
    end
    y = reshape(Y,length(i),length(j));
    

    以下内容为转载:

    https://www.zhihu.com/question/343442170/answer/807474747

    使用parfor时需要注意注意全局变量和局部变量。parfor里允许无限次引用之前就定义好的全局变量,但只允许写入之前使用过的单一变量,这个变量一般是会切片式的在parfor里被引用(i.e., parfor ii= 1:N; foo(ii, :)= XXXX; end) ,一般它的作用是输出数据。局部变量是指在parfor循环里引入的新变量,局部变量在parfor结束后会被直接销毁。当然,你可以在parfor内使用xlswrite之类的生成N个EXCEL表或者txt保存这些变量。

    5.2 SPMD(Single Program/Multiple Data)

    本节内容为转载:

    https://blog.csdn.net/abcjennifer/article/details/17610705?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

    https://blog.csdn.net/xgx198831/article/details/41104291/

    https://blog.csdn.net/awakeljw/article/details/72824674

    单程序多任务进行任务并行

    spmd
        statements
    end
    

    若有很多数据集,smpd将每个数据集在不同的worker上运行以此来实现并行。spmd中的一个重要的参数是labindex,它是指每个worker的索引,用来表示此时正在工作的是哪一个worker。

    Spmd中的“Single program”方面指的是同一段代码运行在不同的多个lab上。你在一个Matlab客户端上运行一个程序,被标志为spmd模块的其他部分运行在其他lab上。当这些块运行完毕后,你的程序继续在客户端运行。 “Multiple data”方面指的是虽然spmd语句在所有的lab上运行相同的代码,但每一个lab可以有不同的,独有的数据。所以多数据集可以在多个lab上同时被容纳。一下是我总结的SPMD使用的两个场景:

    The “single program” aspect of spmd means that the identical code runs on multiple labs. 就是说同一段程序应用于不同的样本(数据),所以一般针对随机抽样的并行,如

    %% SPMD  
    %example 1  
    spmd   
    A = rand(3,2); %generate a matrix A for each lab(worker)  
    end  
    for i = 1:length(A)  
        figure; imagesc(A{i});   
    end  
      
    %example 2  
    a = 3;  
    b = 4;  
    spmd  
        c = labindex();  
        d = c+a;  
    end  
    c{2} = 5;  
    spmd  
        f = c*b;  
    end  
    for i = 1:length(f)  
        fprintf('%d\t',f{i});%access the value of each lab  
    end  
    

    另外,SPMD也可以用于可替代parfor的块并行,在不同lab(worker)上对相同或不同的数据执行不同的并行操作,说起来有些拗口,具体看一下例子就明白了,下面我写的example3,4分别针对在不同lab上对相同数据和不同数据执行不同操作,它们都可以用parfor代替。

    %example3 - deal with same Data by different parameters  
    %add different values to same array Data  
    Data = 1:100;  
    spmd  
        switch labindex  
            case 1  
                Data = Data+1;  
            case 2  
                Data = Data+2;  
        end  
    end  
    % print Data{1} & Data{2} for checking  
                  
    %example4   
    %add different values for different parts of array Data  
    % [1:50]+1  
    % [51:100]+2  
    spmd  
        if labindex == 1  
            Data(1:50) = Data(1:50)+1;  
        else  
            Data(51:100) = Data(51:100)+2;  
        end  
    end  
    

    5.3 SPMD 与 parfor

    本节内容为转载加自己翻译:

    https://stackoverflow.com/questions/12385534/spmd-vs-parfor

     dataset_array={dataset1, dataset2}
     matlabpool open 2
     spmd
          my_function(dataset(labindex));
     end
    

     dataset_array={dataset1, dataset2}
     matlabpool open 2
     parfor i:1=2
          my_function(dataset(i));
     end
    

    的区别:

    spmd is a parallel region, while parfor is a parallel for loop. The difference is that in spmd region you have a much larger flexibility when it comes to the tasks you can perform in parallel. You can write a for loop, you can operate on distributed arrays and vectors. You can program an entire work flow, which in general consists of more than loops. This comes at a price: you need to know more about distributing the work and the data among your threads. Parallelizing the loop for example requires explicitly dividing the loop index ranges amongst the workers (which you did in your code by using labindex), and maybe creating distributed arrays.

    parfor on the other hand only does this - a parallelized for loop. Automatically parallelized, you can add, so the work is divided between the workers by MATLAB.

    If you only want to run a single loop in parallel and later work on the result on your local client, you should use parfor. If you want to parallelize your entire MATLAB program, you will have to deal with the complexities of spmd and work distribution.

    翻译:

    spmd是并行区域,而parfor是并行for循环。区别在于,在spmd区域中,您可以并行执行的任务具有更大的灵活性。您可以编写一个for循环,可以对分布式数组和向量进行操作。您可以对整个工作流程进行编程,该工作流程通常包含多个循环。这是有代价的:您需要更多地了解如何在线程之间分配工作和数据。例如,并行化循环需要在工作线程之间明确地划分循环索引范围(通过使用labindex在代码中进行此操作),并可能创建分布式数组。

    另一方面,parfor做并行化的for循环。您可以添加自动并行化的工作,因此work可以通过MATLAB在workers之间进行划分。

    如果只想并行运行一个循环,然后再在本地客户端上处理结果,则应使用parfor。如果要并行化整个MATLAB程序,则必须处理spmd和工作分配的复杂性。

    注意:parfor,spmd不可以相互或者自身嵌套。

    5.4 Composite类型

    spmd中每个lab返回值以composite存储,如上面[code]example 1中的f就是以composite的形式展现。f{i}为第i个lab的返回值。最开始我们也可以创建Composite对象并进行初始化赋值。

    f = Composite(2);

    6 MATLAB并行计算其他工具说明

    此外,matlab的大多数工具箱都开始支持并行计算,所以如果该问题可以用自带工具箱解决的可以使用工具箱自带的并行计算方法。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    7 参考

    转载自:

    https://blog.csdn.net/xgx198831/article/details/41104291/

    1. MATLAB官网——Parallel Computing Toolbox
    2. 详细讲解并行用法
    3. 详细并行代码
    4. 多核计算平台中MATLAB_并行计算工具包
    5. Parallel Computing Toolbox User’s Guide

    一些可参考的博文:

    Matlab多核并行计算例子
    https://blog.csdn.net/qq_38290475/article/details/82223148

    Matlab并行计算较为专业的介绍
    https://blog.csdn.net/enjoyyl/article/details/41929033

    展开全文
  • Matlab 并行代码

    千次阅读 2019-04-09 15:56:24
    转自:并行代码 1 并行问题的由来——从抛硬币说起 举个简单的例子:抛100次硬币统计正面向上的次数。我们可以拿一个硬币重复地抛100次。但有人嫌麻烦,就想能不能再叫一个人带另外一个硬币过来,两个人同时抛,...

           转自:并行代码

     

    1 并行问题的由来——从抛硬币说起

           举个简单的例子:抛100次硬币统计正面向上的次数。我们可以拿一个硬币重复地抛100次。但有人嫌麻烦,就想能不能再叫一个人带另外一个硬币过来,两个人同时抛,这样每个人就能只抛50次了,节约了时间,并行的思想初现。问题来了,必须保证这2个硬币完全相同以及抛硬币者的动作一致性,才能确保该并行试验的完备性。那么怎么能够保证这两个条件呢?几乎不可能。但我们的计算机软件就能保证试验对象的完全一致性,因为我们可以设置伪随机数的初始种子在每次重复试验的时候一模一样,计算机软件在整数域上的计算上只要不溢出,是100%正确的。

           回到现实,可能很多人都会说自己的仿真好慢好慢,有时候一个仿真可能要1个月。其实,究其根本,仿真之所以这么慢,并不是我们的算法复杂度有多高,根本原因是我们仿真的问题大多情况下是一个随机过程,我么需要不停地拿随机数据去验证算法是否正确。不管是电子、金融,航空航天,亦或是其它领域,我们所面对的问题都是一个随机过程。在概率论中就有一条很著名的公理:当试验的次数趋于无穷大的时候,事件发生的频率才等于概率。该理论思想也导致了蒙特卡洛仿真模型的诞生。所以,为了验证自己算法设计的准确性,我们一般都需要尝试很多次试验,即仿真很大的数据量,这样才能和我们自己推出的理论结果进行有意义的比较。

           由此,从这里切入并行的概念。我们可以让不同的人或者计算机同时进行相同的试验,这就叫并行。用更专业的解释:利用多核、多处理器或者计算机集群进行运算都可以叫做并行处理。目前我们电脑中常用的软件基本都是串行的,在数字IC/FPGA领域,很多的EDA软件都支持并行,比如,Quartus中的P&R就可以并行。当然,并不是所有软件能设计为并行,并行软件的设计是要有前提条件的,下一节会讲。

    2 能够并行运行的条件

           若要并行,必须满足以下2个条件之一:

    • 每次循环之间是相互独立的;
    • 循环执行完之后的结果和循环执行的先后次序无关。

    第1条的例子

    for k = 1 : 100

           a(k) = k;

    end

    即每次循环的k之间是互不相关的。

    第2条的例子

    s = 0;

    for k = 1 : 100

           s = s + k;

    end

    等差数列的和和加法的次序无关,可以从1顺序加到100,但也可以先加100,再加99……这种和循环执行的先后次序无关的操作在MATLAB中叫简约循环,也能在MATLAB中并行化。

           本人做通信相关,通信系统的仿真一般都要跑系统在不同SNR下的性能,其中每个SNR的仿真过程互不影响,满足以上并行的第一个条件。所以,这就是我们并行仿真的切入点。我们可以让不同的处理单元(Processing Unit)仿真不同SNR下的性能。

    3 MATLAB并行开关

           以matlabpool为关键字的命令。关于matlabpool的用法,Help中一大堆,这里就不细讲了,列举几个常用的命令:

    • matlabpool open % 以默认配置方式打开MATLAB并行开关
    • matlabpool open size % 打开MATLAB并行开关并指明并行的核数为size
    • matlabpool close % 关闭MATLAB并行开关

           目前Intel的CPU很多都支持超线程(Hyper Threading,HT)技术,双核4线程或者4核8线程的CPU比比皆是,在windows下最大的并行度只能到核数,而不是线程数,而在Linux下有告诉我说可以最多开到线程数的,我也没试过,这里就抛砖引玉吧。常用的就以上3条命令。

    4 MATLAB并行工作原理

           MATLAB并行基于client-worker模式。首先,MALTAB有个总体负责的client,它将任务合理分配给每个worker,worker的个数即为上一节matlabpool open size命令中的size。每个worker运行完之后将结果回传给client。这样,当client接收到所有的结果后,程序运行完成。

           打开了MATLAB并行开关之后,我们可以在任务管理器中看到MATLAB进程的数目是size+1,即为client和worker的数目和。在运行过程中,worker会满载CPU;但是client不会满载CPU,它只负责分配任务、传递数据和最后的数据采集。

    5 在MATLAB中编写并行代码

           好了,现在我们知道什么样的代码能够并行执行了,也知道如何在MATLAB中打开并行开关了,那么接下来就介绍如何在MATLAB中编写最简单的并行代码:parfor

           parfor,从字面意思就可以看出,parallel for,即并行的for循环。

           parfor循环把变量分为五类:循环变量、广播变量、临时变量、分段变量以及简约变量。虽然有时候我们把for直接改成parfor后没有出现什么问题,但一旦遇到稍微复杂的代码,就会不知所措。搞清楚这五类变量不仅能够避免语法错误,更重要的是能够提高MATLAB的效率,减小代码的运行时间。举例如下:

    a = 100;

    s = 0;

    parfor k = 1 : 100 % k为循环变量

        if a > 10 % 广播变量

            b = 10; % 临时变量

        end

        c(k) = k; % 分段变量,输入属性

        d = 1e3; % 临时变量

        s = s + k; % 简约变量

    end

    • 循环变量:即代码中的k。
    • 广播变量:该变量不是由worker产生,而是当client把任务分配给worker时传给worker的,每个worker都会接收到此类变量。
    • 临时变量:在worker中产生,worker执行完任务之后clear掉,也不会传递给client的变量。
    • 分段变量:这是parfor中最为重要的变量,可以具有输入和输出两类属性。
    • 简约变量:之前已经介绍过了,不再赘述。

           这5种变量的详细说明在Help中都有,要写出来的话会花大量的篇幅,省略。

    6 并行编程之优化

           从前面的描述已经知道,MATLAB的并行程序运行是基于client-worker模式,那么我们的优化目标也会集中在以下2方面:

    • 针对worker的优化;
    • 针对client和worker之间数据交互的优化。

           第一个问题,针对worker的优化,我的前一篇博文《MATLAB并行编程》已经说了一些技巧,这些技巧完全适用于此。

           第二个问题,针对client和worker之间数据交互的优化。我们要尽量减小client和worker之间传递的数据量以节省时间。

     

    一个关键的问题:还用预分配内存吗?上一篇博文《MATLAB并行编程》

    http://blog.sina.com.cn/s/blog_6b597bfb01018sjm.html

    中曾经提到过要在循环之前预分配内存。但是到了并行编程,这个原则应当被摒弃。因为一旦在parfor之前预分配内存了,该分段变量就具备了输入属性,已在client中生成了,client再将其分段传递给不同的worker,这会消耗额外的时间。所以,我们的原则是:分段变量能不增加输入属性就不增加。

           假设单核运行某程序需要时间t,那么N核并行运行的程序的执行时间为t/N+e,这里的e代表的就是client和worker之间数据交互所占用的时间。只要我们这部分的优化做得好,是可以让e相对于t/N忽略不计的。

    7 并行编程之调试

           一般推荐先用for循环写好,程序运行正常之后把for改成parfor,这时如果运气好的话可以直接并行运行,但往往会报一些warning或者error,这就要考验我们对于上几节所说的变量分类了。而且就算没报warning或者error,程序在运行过程中也可能出错,往往这种错误不像串行程序报出是在哪一行的错误,并行的错误一般都会报出“No Remote Error Stack”,按照字面意思就知道,没有栈信息。因为按照普通的代码,调用函数前会先将变量入栈以及保护现场,而到了并行编程,每个worker出错的具体情况是不会回传给client的。因此,我们很难通过返回到command window的错误信息判断程序到底出了什么错。

           在parfor循环内部是不能加断点的,这其实也很好理解,本来不同的循环变量针对的就是不同的worker,在parfor内部加断点的话,软件根本不知道编程人员想要看哪个worker的数据。

           不过,MATLAB还提供了另一种并行调试模式——pmode,主要命令下面3条:

    pmode start % 开启并行调试(默认核数)

    pmode start size % 开启size个核的并行调试

    pmode exit % 退出并行调试模式

           但自己用过一段时间pmode,老实说,不好用。用该调试模式的话需要手动一行一行输m语言。而且在每个worker中的变量还需要手动传递到client,就是各种不方便。还是希望MATLAB以后能支持直接在Editor中的parfor循环内部加断点(虽然就像上段所说会有困难,但相信MathWorks公司的攻城狮一定能解决这个问题!),再加上一些labindex类似的调试语法规则,这样一定能大大提高程序设计人员的开发效率。

    8 其它MATLAB并行编程

      除了基于parfor的并行,MATLAB还支持其他种类的并行:

    • SPMD(Single Program Multiple Data),即单指令多数据,即假使我们有一个很大的数据文件,用串行的代码可能要读取很久,现在将数据文件分割,用相同的程序读取不同的数据。这种并行方式很适合目前炒的火热的海量数据处理。
    • 基于cluster的并行。parfor只能在一台电脑上的单CPU中的不同核上进行并行运算,这明显还是太弱了,MATLAB也支持在一台电脑的多CPU上并行,甚至还能支持多台电脑并行处理,往更大的说,即基于cluster的并行。不过,这时client和worker之间的通信已经不再是核间通信了或者一台电脑内部的CPU之间的通信了,而是基于局域网的通信,局域网的速度特会大大影响并行代码的执行效率。不过现在千兆以太网随处可见,只要通信量不是特别大,估计整个程序的瓶颈还是在每个worker上的代码优化。
    • 基于GPU的加速。最近2年GPU加速(不仅仅是针对MATLAB平台)也是炒的沸沸扬扬,很幸运MATLAB也支持GPU加速,不过对这部分的内容丝毫不懂。
    •  
    展开全文
  • matlab云计算课程-matlab并行计算讲座.pdf 魏老师讲座,可以学习一下!
  • 基于matlab并行计算

    2015-12-21 17:22:27
    Matlab并行计算是指针对不同的计算平台(单机或集群),运用不同的计算工具箱。 (1)用于单机多核(最多4核)环境的并行计算工具箱(Parallel Computing Toolbox)。 (2)在集群环境中实现并行计算的分布式计算...
  • Matlab 并行计算学习初步

    万次阅读 多人点赞 2018-08-09 08:19:57
    Matlab 并行计算学习 1. 简介 高性能计算(High Performance Computing,HPC)是计算机科学的一个分支,研究并行算法和开发相关软件,致力于开发高性能计算机。可见并行计算是高性能计算的不可或缺的重要组成部分。 ...

    Matlab 并行计算学习

    1. 简介

    高性能计算(High Performance Computing,HPC)是计算机科学的一个分支,研究并行算法和开发相关软件,致力于开发高性能计算机。可见并行计算是高性能计算的不可或缺的重要组成部分。

    1.1 并行计算

    并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程,是提高计算机系统计算速度和处理能力的一种有效手段。它的基本思想是用多个处理器来协同求解同一问题,即将被求解的问题分解成若干个部分,各部分均由一个独立的处理机来并行计算。并行计算系统既可以是专门设计的、含有多个处理器的超级计算机,也可以是以某种方式互连的若干台的独立计算机构成的集群。通过并行计算集群完成数据的处理,再将处理的结果返回给用户[1]

    1.2 并行计算平台

     

    平台是并行计算的载体,它决定着你可以用或只能用什么样的技术来实现并行计算。

    多核和集群技术的发展,使得并行程序的设计成为提高数值计算效率的主流技术之一。常用的小型计算平台大致分为:由多核和多处理器构建的单计算机平台;由多个计算机组成的集群(Cluster)。前者通过共享内存进行数据交互,后者通过网络进行数据通信。

    计算正在从 CPU(中央处理)向 CPU 与 GPU(协同处理)的方向发展。

    GPU最早主要应用在图形计算机领域,近年来,它在通用计算机领域得到了迅猛的发展,使用GPU做并行计算已经变得越来越重要和高效。

    常用的并行计算技术包括多线程技术、基于共享内存的OpenMP技术,基于集群的MPI技术等。但它们都需要用户处理大量与并行计算算法无关的技术细节,且不提供高效的算法库,与数值计算的关联较为松散。

     

    1.3 Matlab与并行计算

     

    Matlab即是一款数值计算软件,又是一门语言,它已经成为数值计算领域的主流工具。Matlab提供了大量高效的数值计算模块和丰富的数据显示模式,便于用户进行快速算法的研究和科学建模仿真。自Matlab 2009 之后,Matlab推出了并行计算工具箱(Parallel ComputingToolbox,PCT)和并行计算服务(Distributed ComputingServer,DCS),通过PCT和DCS用户可以实现基于多核平台、多处理器平台和集群平台的多种并行计算任务。利用PCT和DCS,用户无需关心多核、多处理器以及集群之间的底层数据通信,而是将主要精力集中于并行算法的设计。此外,PCT还增加了对GPU(Graphics ProcessingUnit)的支持。

    2. Matlab并行计算初探

     

    Matlab 并行计算工具箱,使用多核处理器,GPU和计算机集群,解决计算和数据密集型问题。高层次的结构并行for循环,特殊阵列类型和并行数值算法,让你在没有而CUDA或MPI编程基础的条件下并行MATLAB应用程序。您可以使用带有Simulink的工具箱并行运行一个模型的多个仿真。

    该工具箱,通过在本地workers(MATLAB计算引擎)上执行应用程序,来使用多核台式机的全部处理能力。不用改变代码,就可以在计算机集群或网格计算服务(使用MATLAB分布式计算服务器™)上运行相同的应用程序。可以交互地或批处理地运行并行应用程序。

    包含以下特性:

     

    • 并行for循环 (parfor),可以在多个处理器上运行任务并行算法。
    • 支持CUDA的NVIDIA GPU。
    • 通过本地workers,充分利用台式机的多核处理器。
    • 计算机集群和网格计算支持(通过MATLAB分布式计算服务)。
    • 以交互方式和批量方式执行并行应用程序。
    • 分布式阵列和SPMD(single-program-multiple-data),用于大型数据集的处理和数据并行算法。

     

    本文仅介绍循环的并行,批处理和GPU并行计算。

     

    2.1 并行池

     

    2.1.1 开启和配置并行池

    在使用parfor和spmd之前,首先要配置和开启并行计算池。parpool函数[1]提供并行池的配置和开启功能,其用法如下表 2‑1:

    表 2‑1 parpool函数用法

    此外,还可以给上述命令指定输出参数,如输入:p = parpool,输出如下图:

    图2‑1 输入命令p=parpool时的运行结果

    输出参数p为并行池对象,一个池对象有7中属性,上图显示了6种属性。其中,“NumWorkers” 代表worker的个数,也就是说开启了两个并行池;“IdleTimeout”指定了池定时关闭的时长,单位为分钟,图中为30分钟;“SpmdEnabled”指定池是否可以运行SPMD代码,其它属性相见Matlab 并行工具箱手册[2]。

    此外,可以通过p.Property 访问和设置属性,如p.IdleTimeout = 10; 可以设置定时关闭池的时长为10分钟。

     

     

    1.1.1.           获取当前池(gcp)

    如果在启动池时没有设置输出参数p,可以使用gcp函数获取当前池的对象,gcp的用法如下表2-2:

     

     

    表 2‑2 gcp用法

    语法和参数

    功能

    p = gcp

    获取当前池对象,如果未开启,则使用默认配置文件创建池。

    p = gcp('nocreate')

    获取当前池对象,如果未开启,返回空。

    1.1.2.           关闭池(delete)

    Matlab中,使用delete函数关闭或删除池,用法:delete(poolobj),其中poolobj为要关闭的池对象。

    1.2.  循环并行parfor

    1.2.1.           Matlab client和Matlab worker

     

    Matlab client 分配 parfor 并行任务到多 个 Matlab

    图 2‑2 Matlab client 分配parfor并行任务到多个Matlab

    Matlab并行执行parfor循环时,采用client和worker模式。其中client指编写和启动并行代码的Matlab段,worker指并行运行代码的Matlab端。用户可以将Matlab软件理解为一个进程,在同一计算机或网络上的多个计算机上可以运行多个Matlab进程,每个Matlab进程之间通过某种方式进行数据传输,用户首先在client端编写代码,然后再client端运行编写的代码,在运行代码的过程中,如果某个程序需要并行执行,Matlabclient端根据并行代码的关键字及类型将并行代码分配到本机或网络上的其它Matlab进程执行,那些最终执行并行代码的Matlab进程即为worker[3]。右图显示了,Matlab client 对parfor关键字的处理,它将任务分配到多个Matlab workers 上并行执行程序。假设m为Matlab worker的数量,循环次数为n,若n/m为整数的话,则循环将被均匀划分到Matlab worker;否则,循环被非均匀划分,有些Matlab worker的负载会大些。

    1.2.2.           并行程序中的循环迭代parfor

    应用parfor的一个基本前提是循环可以被等效分解,即分解后的循环的执行顺序不会影响最终结果。parfor的用法与for类似,其语法如下表 2‑3:

     

    表2‑3 parfor的用法

    语法和参数

    功能

    parfor loopvar = initval:endval,statements,end

    在并行池中执行循环。其中initvalendval必须为正整数,或者是一个包含连续递增的整数矢量。parfor i = range; <loop body>; end ,这样单行书写也是可以的,其中的“;”可以是“,”。

    parfor (loopvar = initval:endval, M), statements, end

    使用M指定执行循环体的Matlab worker的最大数量,M为非负整数,如果M=0,则在client上串行执行。

     

    并行计算间的数据转移大小极限受Java虚拟机(JVM)内存分配的限制。在MJS集群上执行job的client和worker间的单次数据转移量也受此限制。具体大小限制取决于系统结构。如下表所示:

    表 2‑4 每次转移数据的最大量与系统结构的关系

    系统结构(System Architecture

    每次转移数据的最大数(近似值.)

    64-bit

    2.0 GB

    32-bit

    600 MB

    1.2.3.           利用parfor并行for循环的步奏

    使用parfor并行for循环的基本步骤为:

    1)       使用parpool函数配置和开启并行计算池。

    2)       将串行循环中的for关键字改为parfor,并注意是否要修改循环体,以满足特定要求,如循环变量的类型要求(参见参考手册)

    3)       执行完毕后若不再进行并行计算,使用delete关闭并行池。

    1.3.  批处理(batch)

    batch函数完成函数或脚本在集群或台式机上的分载执行,也就是实现函数或脚本的并行。这里不再说明语法(详见Matlab 并行工具箱参考手册),而是举两个例子说明它的使用方法(此例子亦来自参考手册)。

    1.3.1.           运行批处理任务

    创建mywave.m脚本文件,输入如下代码并保存:

     

    for i=1:1024

      A(i) = sin(i*2*pi/1024);

    end

    在命令行窗口输入:job = batch('mywave'),Matlab以下图所示方式并行运行:

    批处理 for 循环

    图 2‑3 批处理for循环

    然后等待作业完成:wait(job),使用load命令将数据从Matlabworker 转移到Matlabclient的workspace,即load(job,’A’)。任务完成后,使用delete(job)永久删除它的数据。

    1.3.2.           运行批处理并行循环

    打开mywave.m脚本文件,修改for为parfor,保存,代码如下:

     

    parfor i=1:1024

      A(i) = sin(i*2*pi/1024);

    end

           输入:job =batch('mywave','Pool',2),以两个worker来执行parfor并行循环任务,所以此例总共使用3个本地worker,如下图所示:

    批处理并行循环

    图2‑4 批处理并行循环

    同样的,依次使用wait(job)load(job,'A'),将数据从worker的workspace转移到client的workspace。最后,使用delet(job)删除数据。

    批处理命令还有其它的运行方式,在此不再介绍。

    1.4.  MATLAB的GPU计算

    Matlab 的GPU计算实现MATLABworkspace和图形处理器(GPU)间的数据传递;在GPU上执行代码。

    用户可以使用计算机的GPU处理矩阵运算,在大多数情况下,在GPU上执行要比在CPU上快。

           Matlab的GPU计算提供了下表 2‑5所列的14种MATLAB函数和1种C语言函数,表中仅简要介绍函数功能,具体参见Matlab并行工具箱参考手册。

    表2‑5 GPU计算函数列表

    函数

    功能

    gpuArray

    在GPU上创建阵列。

    gather

    把分布式阵列或gpuArray转移到Matlab的workspace。

    existsOnGPU

    确定gpuArray或CUDAKernel在GPU上可用。

    gpuDevice

    查询或选择GPU设备。

    gpuDeviceCount

    目前GPU的设备数量。

    gputimeit

    在GPU上运行函数所需时间。

    reset

    重置GPU设备并清空它的内存。

    wait(GPUDevice)

    等待GPU计算完成。

    arrayfun

    对GPU阵列上的每个元素应用函数。

    bsxfun

    用于GPU阵列的二元但扩展函数。

    pagefun

    对GPU阵列的每一页应用函数。

    parallel.gpu.CUDAKernel

    从PTX和CU代码创建 GPU CUDA kernel 对象。

    feval

    评估GPU的核。

    setConstantMemory

    设置GPU的一些常量内存。

    mxInitGPU

    这是一个C语言函数,在当前选择的设备上初始化Matlab GPU计算库。

     

    Matlab的GPU计算提供了三种Matlab类和一种C类,如下表 2‑6

    表2‑6 Matlab GPU计算提供的类

    描述

    gpuArray

    存储在GPU上的阵列

    GPUDevice

    图形处理单元Graphics processing unit (GPU)

    CUDAKernel

    执行在GPU上的核

    mxGPUArray

    它是一个C类,MEX函数可以访问Matlab的gpuArray

    关于各类的具体含义和各函数的详细用法请参见MATLAB并行工具箱手册。

    下面主要从:GPU设备查询、在GPU上创建数组、在GPU上运行内置函数、在GPU上运行自定义函数四个方面说明Matlab GPU计算支持的技术,此外,用户还可以在GPU上运行CUDA或PTX代码、运行包含CUDA代码的MEX-函数等等,详见MATLAB并行工具箱手册和文献[3]的第10章。

     

     

    1.4.1.   GPU 设备查询与选择

     

    GPU 设备信息

    图 2‑5 GPU设备信息

    GPU设备查询与选择

    在使用GPU设备之前,可以利用gpuDeviceCount函数查看计算机当前可用GPU设备数量,若存在可用的GPU设备,则输出大于等于1的数。

    在Matlab中使用gpuDevice(IDX)来选择第IDX个GPU设备,起始编号为1,如输入gpuDevice(1),输出右图所示结果:

    其中,“MaxThreadsPerBlock”表示每个Block的最大线程数;“MaxShmemPerBlock”表示每个Block可用的最大共享内存大小;“TotalMemory”表示GPU拥有的所有内存,图中为2.1475e+09Byte,即2GB;“FreeMemory”代表可用内存;“MultiprocessorCount”表示GPU设备处理器个数;“DeviceSupported”表示本机Matlab支持的GPU设备数。

     

    1.4.2.           在GPU上创建阵列

    有两种方式在GPU上创建阵列:从Workspace转移和直接创建。

    1)       从Workspace转移到GPU

    使用gpuArray函数来把数据从Workspace转移到GPU,如下面的代码所示,将Workspace中的阵列A转移到GPU中,并存为G,原Workspace中的A阵列并不消失。

     

    A = [1 2 3;4 5 6];

    G = gpuArray(A);

    该函数支持对非稀疏阵列且可以是:'single','double','int8','int16','int32','int64','uint8','uint16','uint32','uint64',or 'logical'类型。

    2)       直接创建GPU阵列

    gpuArray类提供了一些方法来在GPU上直接创建阵列,这样就不需要从Workspace进行转移。可用的有:

     

    表 2‑7 gpuArray类提供的创建GPU阵列的方法

    方法

    方法

    eye(___,'gpuArray')

    rand(___,'gpuArray')

    false(___,'gpuArray')

    randi(___,'gpuArray')

    Inf(___,'gpuArray')

    randn(___,'gpuArray')

    NaN(___,'gpuArray')

    ones(___,'gpuArray')

    gpuArray.linspace

    true(___,'gpuArray')

    gpuArray.logspace

    zeros(___,'gpuArray')

    gpuArray.colon

    如:G = ones(100,100,50,'gpuArray');在GPU上创建一个100-by-100-by-50的阵列。

    此外,支持gpuArray阵列的方法还有abs,cos,fft,conv,plot等等共369个方法。若要查看,输入如下命令即可查看:

     

    methods('gpuArray')

    如果,要查看某个方法的帮助,输入如下命令查看:

     

    help gpuArray/functionname

    其中,functionname为函数名,如:helpgpuArray/dot

    3)       从GPU上回收数据

    从GPU上回收数据,即把数据从GPU转移到MatlabWorkspace。在Matlab中使用gather函数来取回GPU上的数据并存在Matlab的 Workspace中。可以使用isequal函数来验证转移前后,值是否相同。如下代码将GPU中的阵列G传回到Workspace生成D。

     

    G = gpuArray(ones(100,'uint32'));

    D = gather(G);

    OK = isequal(D,G)

     

    1.4.3.           在GPU上运行内置函数

    如 2)直接创建GPU阵列 所述,Matlab的369个函数都支持对GPU阵列的操作,下面是手册上的一个示例代码:

     

    Ga = rand(1000,'single','gpuArray');

    Gfft = fft(Ga);

    Gb = (real(Gfft) + Ga) * 6;

    G = gather(Gb);

    代码主要实现对GPU上的阵列Ga进行FFT变换,并将结果回收到Workspace。可见内置函数的调用与普通串行程序没有大的区别,只是输入阵列的类型为gpuArray。

    1.4.4.           在GPU上运行自定义函数

    Matlab中使用arrayfunbsxfun来执行自定义的函数,即:

     

    result = arrayfun(@myFunction,arg1,arg2);

    下面举例来说明,创建myfun.m文件,打开输入如下代码:

     

    function [ absga1,absga2,maxga ] = myfun( ga1,ga2 )

    absga1 = abs(ga1);

    absga2 = abs(ga2);

    maxga = max(absga1,absga2);

    该代码实现对输入阵列ga1,ga2的每个元素取绝对值,然后取出两者中对应最大的。为了运行并查看结果,创建一个脚本,输入如下代码:

     

    ga1 = [-1 5 -3]

    ga2 = gpuArray([4 -6 -2])

    [absga1,absga2,maxga] = arrayfun(@myfun,ga1,ga2)

    absda1 = gather(absga1)

    absda2 = gather(absga2)

    maxda = gather(maxga)

    通过上述程序,可以看出,在自定义函数myfun中,只要有一个输入参数的类型为gpuArray,则整个函数myfun都将运行在GPU中,对于非gpuArray类型的阵列,Matlab自动进行转换。

    除了可以调用Matlab自身支持的函数外,可以自己编写支持GPU的Matlab函数。自定义的函数中可以调用的函数和操作如下表 2 8:

    表2‑8 自定义函数中支持gpuArray的函数和操作

    abs

    and

    acos

    acosh

    acot

    acoth

    acsc

    acsch

    asec

    asech

    asin

    asinh

    atan

    atan2

    atanh

    beta

    betaln

    bitand

    bitcmp

    bitget

    bitor

    bitset

    bitshift

    bitxor

    ceil

    complex

    conj

    cos

    cosh

    cot

    coth

    csc

    csch

    double

    eps

    eq

    erf

    erfc

    erfcinv

    erfcx

    erfinv

    exp

    expm1

    false

    fix

    floor

    gamma

    gammaln

    ge

    gt

    hypot

    imag

    Inf

    int8

    int16

    int32

    int64

    intmax

    intmin

    isfinite

    isinf

    isnan

    ldivide

    le

    log

    log2

    log10

    log1p

    logical

    lt

    max

    min

    minus

    mod

    NaN

    ne

    not

    or

    pi

    plus

    pow2

    power

    rand

    randi

    randn

    rdivide

    real

    reallog

    realmax

    realmin

    realpow

    realsqrt

    rem

    round

    sec

    sech

    sign

    sin

    single

    sinh

    sqrt

    tan

    tanh

    times

    true

    uint8

    uint16

    uint32

    uint64

    xor

     

     

    +

    -

    .*

    ./

    .\

    .^

    ==

    ~=

    <=

    >=

    &

    |

    ~

    &&

    ||

    以下的标量扩展版:

    *

    /

    \

    ^

    分支指令:

    break

    continue

    else

    elseif

    for

    if

    return

    while

     

     

    2.       总结

    本文简要介绍了Matlab并行工具箱及其用法,包括多处理器的并行和GPU的并行,具体包括:并行计算池的开启,查询与关闭;for循环的并行;批处理;GPU计算。由于时间关系并未介绍分布式阵列和SPMD。

    尝试并行化自己改进的Hough变换算法和FCM,可是并行后的效果很差(这和使用的电脑的配置有关),本文中并未给出,将来会进一步研究。

    之所以选择高性能计算这门课,是因为在研究学习中,发现程序的运行速度是一个很重要和亟待解决的问题。已经尽量采用矢量化编程实现,可是它的本质是牺牲空间换时间,仍不能满足需求。高性能计算让我找到了突破点,将来会继续开展相关的工作。

     

    [1] http://baike.baidu.com/view/1666.htm?fr=aladdin

    [2] 并行工具箱在线手册:http://cn.mathworks.com/help/distcomp/index.html

    [3] 实战 Matlab之并行程序设计[J]. 2012.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • matlab并行计算的几种方法进行了实测,给出了测试结果。
  • MATLAB 并行计算

    2020-12-23 13:37:17
    主要函数:parfor并行 for 循环说明:parfor LoopVar = InitVal:EndVal; Statements; end在生成的 MEX 函数中或在共享内存多核平台上并行运行的 C/C++ 代码中创建一个循环。parfor 循环对 InitVal 和 Endval 之间的 ...
  • [续] Matlab 并行编程——多核 多线程

    千次阅读 2021-01-14 00:06:48
    刚开始接触matlab并行计算,以前旧电脑从不考虑这些的小本i7四核八线程16G内存,64位win7和matlab 2012b,任务管理器显示有8个框当用普通for循环,只有一个框接近100%,cpu使用率只有12%左右默认配置下,键入...
  • 对于一个多核处理器,不开多核并行计算,实在是对不住Matlab自带的并行计算功能。parfor循环较为简单,但是它对for循环中的变量要求比较严格,稍有不慎就会出错(我深受其害)。使用Matlab Toolbox中的createJob/...
  • matlab并行计算命令

    2021-04-22 02:32:48
    1. matlab仿真模型怎么并行计算以单台双核计算机为例。...MATLAB并行计算的模式有几种?主要是两种:parfor模式和spmd模式。两种模式的应用都很简单。第一个中,parfor其实就是parallel+for简化而来,顾名思义啊,...
  • Mathwoks在Matlab R2007a版本的Parallel Computing Toolbox(并行计算工具箱)中加入了并行循环parfor-loops,对于每一步可以独立于其他步的循环,计算效率可以有较大幅度的提高。以前简单的for循环for-loop是顺序的...
  • matlab环境下,使用distcomp工具箱配置并行环境的详细指南。同时提供了一个编程实例,可以实现初步的编程,给读者直观的感觉,方便读者上手
  • matlab并行错误

    2021-04-21 21:51:32
    报错运行matlab并行时得到如下报错:failed to start a parallel pool. (For information in addition to the causingerror, validate the profile 'local' in the Cluster Profile Manager.)Caused by:Error ...
  • 此方法只是利用了matlab的设定,不需要额外知识。 众所周知,matlab是单线程的,但matlab的每个应用窗口都是一个线程,因此...如果并行需要简单的交互,可以写一个通信文件,让所有的M文件都读写这个文件,这样互相之间
  • Matlab并行效率问题

    2021-02-01 10:57:00
    本帖最后由 xidianbianjiang 于 2013-10-10 16:26 编辑大家好,我所用的机器为实验室24核的工作站,按照Matlab的说明,单机最多使用12个worker。...其次,就我自己的实践来说,我的程序改为并行后速度只提高的不...
  • MATLAB并行计算

    2020-10-12 13:38:01
    先上图,图中求500次随机矩阵的特征值,串行14.85s,并行3.63s 。 %% 串行计算 tic S1=1; for i = 1:500 S1 = S1+max(eig(rand(i))); end display(strcat('客户端串行计算时间:',num2str(toc),'秒')); 并行...
  • matlab并行/集群计算

    2021-05-25 22:06:51
    GPU并行计算:https://blog.csdn.net/enjoyyl/article/details/41929033 单机多核并行计算:... 利用云服务器集群计算:https://www.mathworks.com/help/matlab-paralle
  • Elapsed time is 70,这样用分布式计算工具箱可以进行并行计算(matlabpool这个命令好像是在并行计算工具箱里的).当要关闭开辟的2个labs时;s=sum(x).Elapsed time is 7,剩下两个进程专门用来计算的.显示正在进行多核...
  • Windows环境下的分布式并行计算平台搭建 MATLAB并行平台底层架构 MATLAB并行平台搭建 并行程序的编写与实例 实验室MATLAB并行集群 * MATLAB并行平台底层架构一 并行平台上的三种角色 警察维护整个平台 (mdce底层维护...
  • 多开MATLAB并行计算

    2021-04-08 10:19:25
    进而实现MALTAB自动化控制多个子MATLAB运行,而且还可以利用MATLAB与MATLAB之间的消息传递方法,例如读写文本的形式传递消息,参见利用读写文本实现MATLAB应用之间的消息传递,实现多个MATLAB并行计算并相互沟通协调...
  • Matlab并行编程

    2021-04-21 14:09:08
    本文讲的Matlab并行编程包括并行for循环和数据并行(同一个程序运行在不同的数据上),分别对应于parfor、spmd方法1. 并行方法parpool %开启并行池(parallel pool)%parallel programdelete(gcp('nocreate')) % 关闭...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,635
精华内容 5,854
关键字:

matlab如何并行

matlab 订阅