很多应用程序中包含多个重复的代码部分,这些代码可能有多次循环迭代,也可能只有少量的循环迭代,但他们只是重复次数与输入参数的区别,对于处理这样的数据,并行计算是一个理想的方法,并行循环的唯一限制是每个循环间没有相互的依赖关系当然,对于相互依赖的程序代码,也有可以实现并行计算的技巧对于MATLAB,你可以选择运行一个庞大的批处理程序,也可以选择将他们拆分成多个任务由多个远程的计算机并行地执行,那将会极大的增加运行效率。
同时,如果要处理的数据过于庞大,并行计算的性能也将明显优于异步的计算与处理
今天看见matlab有个这样的按钮,研究一下是啥。。。
在m文件的选项里面
然后短暂的运行一下,看英语是什么批处理的意思
代码语言:javascript复制https://www.mathworks.com/help/parallel-computing/run-script-as-batch-job.html
文档在这里
就是一些相似的工作,有一些简单的差别
不必要手动的去处理,所以才使用这个东西
代码语言:javascript复制job = batch('myScript');
你如果像处理一个脚本作为批处理,就这样的写
代码语言:javascript复制diary(job)
这个函数不陌生,就是打印中间结果的。
代码语言:javascript复制load(job,'x');
plot(x)
最后使用load把结果加载出来
至于为什么这么多条条,也好解释,就是对函数做了一些参数上面的变化
代码语言:javascript复制delete(job);
clear job
整完以后擦屁股
代码语言:javascript复制https://www.mathworks.com/help/parallel-computing/index.html?s_cid=doc_ftr
其实这个东西也是一个工具箱
代码语言:javascript复制https://www.mathworks.com/help/pdf_doc/parallel-computing/parallel-computing.pdf
1千多页我悟了。。。
更加全面的分析
用来再看。我这个段位还用不到这个
我说看看有没有GUI什么的,好像没有
下面是一个简单介绍matlab并行计算的文章,属于不知道多少次的转载,我找到原文地址了
代码语言:javascript复制http://blog.sina.com.cn/s/blog_74567b5d0101d4t0.html
Parallel Computing Toolbox是一个matlab2011开始提供的组件,用于提供交互式的并行计算功能
一、运用的场合
很多应用程序中包含多个重复的代码部分,这些代码可能有多次循环迭代,也可能只有少量的循环迭代,但他们只是重复次数与输入参数的区别,对于处理这样的数据,并行计算是一个理想的方法,并行循环的唯一限制是每个循环间没有相互的依赖关系
当然,对于相互依赖的程序代码,也有可以实现并行计算的技巧
对于MATLAB,你可以选择运行一个庞大的批处理程序,也可以选择将他们拆分成多个任务由多个远程的计算机并行地执行,那将会极大的增加运行效率
同时,如果要处理的数据过于庞大,并行计算的性能也将明显优于异步的计算与处理
二、并行计算方案简介
- 交互运行一个循环程序
在这个例子中,我们只是要学习怎么将一个简单的for循环程序变成一个并行执行的程序,for循环中处理的数据量以及for循环的迭代次数都是很小的,因此,很难在这个例子中体现出并行计算的效率优势
1、假设你的代码中包含下面一个显示正弦波形的for循环:
for i=1:1024
A(i) = sin(i*2*pi/1024);
end
plot(A)
2、为了能够使用matlab提供的交互式工具,你需要首先打开matlabpool,这个组件可以运行在你的本地计算机上,也可以运行在多个远程计算机上
matlabpool open local 3
3、在matlabpool上,通过使用parfor关键字,你可以将你的代码修改为并行运行的程序:
parfor i=1:1024
A(i) = sin(i*2*pi/1024);
end
plot(A)
4、当程序运行结束,我们要使用下面一条指令关闭matlabpool,并且释放被占用的处理器或
两段代码唯一的区别是将关键字由for变为了parfor,而两段代码的执行结果也是极其相似的
但是,因为这个程序中,每次循环迭代都只是参数不同,之间并没有依赖关系,因此,每次迭代并不一定运行于同一个处理器上,通过parfor关键字声明,每一个迭代可能在多个处理器或多个计算机上并行执行,但并没有任何保证执行顺序的技术,因此,A(900)可能在A(400)之前运行
- 运行一个批处理作业(batch job)
首先,先介绍一下matlab中的批处理作业的概念,使用批处理命令可以让matlab分担某个任务一段时间,下面是一个for循环的例子
1、首先使用下面的命令创建一个脚本
edit mywave
2、在 MATLAB Editor 中键入下面的代码,完成for循环显示函数
for i=1:1024
A(i) = sin(i*2*pi/1024);
end
3、保存并关闭 MATLAB Editor
4、在Matlab命令窗口中输入批处理命令来让脚本在单独的Matlab工作间中执行
job = batch('mywave')
5、batch命令不会阻塞matlab,所以你必须等待工作的完成然后去查看他的结果
wait(job)
6、使用load命令可以把工作间中的变量传输到客户端前
load(job, 'A')
plot(A)
7、工作完成后,要记得调用下面的命令清除数据
destroy(job)
上面的代码将matlab的工作间与客户端之间相分开,很大的提高了效率
- 运行一个交互的批处理作业(batch job)
下面的例子将上面的两个例子结合在一起,完成parfor的batch job
1、在MATLAB Editor中编辑你的脚本
edit mywave
2、如下修改你的脚本
parfor i=1:1024
A(i) = sin(i*2*pi/1024);
end
3、保存并退出MATLAB Editor
4、和前面一样,我们运行这个脚本,但是这一次我们要使用一个MATLAB pool 来运行这个脚本
job = batch('mywave', 'matlabpool', 3)
5、和之前一样,我们要去查看结果需要执行下面的代码
wait(job)
load(job, 'A')
plot(A)
6、工作完成后,要记得调用下面的命令清除数据
destroy(job)
上面的这段代码将一个批处理工作分给了三个不同的工作间来协作完成
代码语言:javascript复制for i = 1:numberOfParallelProcesses
startANewRunOfTheScript();
end
其实对于我们来讲,我们只是想要一个这样的工作方法
代码语言:javascript复制for idx = 1:n
job(idx) = batch('MyProcessing');
end
我们可以使用批处理的方法写成这样
代码语言:javascript复制for idx = 1:n
wait(job(idx)); % wait for results to arrive
out{idx} = load(job(idx));
end
最后使用job的load方法获得结果