MATLAB里面的parfor使用方法
2018-01-01 22:52
3039 查看
HPC即高性能算法(high performance computing),是计算机科学的一个分支,研究并行算法并开发相关软件,致力于开发高性能计算机!MATLAB作为工程界数值计算的主流工具,自MATLAB 2009就已经推出了并行算法工具箱!
1:在使用parfor之前,我们需要开启并行池,在PCT里面,parpool函数提供了并行池的开启和配置。
(1):parpool的开启方法:
(2):parpool的配置方法:
我们可以在开启parpool的同时指定一个并行池对象,通过这个对象我们可以知道当前并行池的属性,并且通过这个对象设置并行池的属性。
比如,我们令va=parpool(4),在命令行窗口输入va运行可以得到(这图大的有点不协调呀):
其中几个大家主要关心的参数是,NumWorkers代表池的数量,IdleTimeout代表池存在的时长,SpmdEnabled代表池是否可以运行spmd代码。然后我们可以通过va.property来设置池对应的属性。
另外,如果我们在开启并行池的时候忘记指定池对象了,我们可以通过gcp函数获取当前的池对象,比如:va=gcp。
(3):parpool的关闭:
方法一:等待MATLAB自动关闭池;方法二:关闭 MATLAB(简单暴力);方法三:使用delete函数,syntax:delete(parpoolobjection)。
但是我们启动并行池是需要一定时间的,所以......
2:parfor的使用方法:
parfor循环和平时用的for循环是类似的,但是呢,它和 for 又有些不同的地方,我们运行下面的两种算法:
parfor算法: 运行结果:
for 算法: 运行结果:
(在这里,我没有写开启并行池的代码,系统可以按默认配置自动开启,我的计算机是四核的,所以NumWorkers=4!但是一个优秀的码农应该在使用前 parpool开启并行池,使用后delete关闭并行池。很明显,我不是
。)
我们看到两种循环语句运行的结果是不一样的,parfor是不能保证迭代是按顺序进行的!
(1):parfor的使用场合:
上面的例子是一个迭代次数少的循环过程,体现不出parfor优势,而且 parfor在运行时还涉及底层的通信,因此在这种时候使用 parfor可能还会得不偿失。 但是当进行蒙特卡洛模拟这些冗长的算法的时候,parfor就可以体现自己的优势了。 parfor 的使用限制包括:1:不可以在 parfor循环里面再次使用 parfor;2:每个迭代都必须独立于其他迭代。(我的理解就是工头给每个工人分配任务,工人的数量就是NumWorkers,工头对每个工人都是公正的,所以分配任务parfor的时候每个工人领到的任务是随机的。每个工人只和工头交流,工人和工人没有交流,这就意味着每个工人领到的任务都是可以自己独立完成的。工人是最低的层次,他们下面没有其他的阶级,这就意味着工人只能接受工头的任务,但不能再分配parfor自己已经得到的任务!)
(2):嵌套循环的parfor写法:
for循环里面可以嵌套for循环,但是parfor循环里面不可以嵌套 parfor循环,这是for和 parfor的又一不同之处。用 parfor改写嵌套循环有三种方法:
方法一:
方法二:
但是吧,这两种方法都不能把parfor的作用发挥的淋漓尽致,于是乎,有了第三种方法:
、
但是有时候我们在做嵌套循环的时候,会涉及二维数组的处理,用第三种方法得到的ij通过双下标的方式来访问二维数组就会报错,这个时候是有另外一种解决办法的!
(3):parfor里面的变量:
parfor里面一共有五种变量,分别是loop,sliced,broadcast,reduction和temporary,当一个parfor循环里面的变量不能被划分到其中一种的时候,就会出错!在这里,先呈上各个变量的英语解释!
loop是循环变量,应该挺好理解的;broadcast变量是在循环之前定义的变量,在循环中只取值,并不指定新的值;temporary变量是在循环中定义的变量,有且仅在循环中有效,在循环之外无效,还有一点就是它并不影响循环之前定义的同名变量;sliced变量,有人管它叫切片变量(个人感觉这个名字怪怪的),在很多时候是指数组了。reduction变量是一个最后的结果和运算顺序无关的量,它的产生涉及到简约运算符和一定的规则,然后笔者才疏学浅,就不介绍了,哈哈哈!
1:在使用parfor之前,我们需要开启并行池,在PCT里面,parpool函数提供了并行池的开启和配置。
(1):parpool的开启方法:
(2):parpool的配置方法:
我们可以在开启parpool的同时指定一个并行池对象,通过这个对象我们可以知道当前并行池的属性,并且通过这个对象设置并行池的属性。
比如,我们令va=parpool(4),在命令行窗口输入va运行可以得到(这图大的有点不协调呀):
其中几个大家主要关心的参数是,NumWorkers代表池的数量,IdleTimeout代表池存在的时长,SpmdEnabled代表池是否可以运行spmd代码。然后我们可以通过va.property来设置池对应的属性。
另外,如果我们在开启并行池的时候忘记指定池对象了,我们可以通过gcp函数获取当前的池对象,比如:va=gcp。
(3):parpool的关闭:
方法一:等待MATLAB自动关闭池;方法二:关闭 MATLAB(简单暴力);方法三:使用delete函数,syntax:delete(parpoolobjection)。
但是我们启动并行池是需要一定时间的,所以......
2:parfor的使用方法:
parfor循环和平时用的for循环是类似的,但是呢,它和 for 又有些不同的地方,我们运行下面的两种算法:
parfor算法: 运行结果:
for 算法: 运行结果:
(在这里,我没有写开启并行池的代码,系统可以按默认配置自动开启,我的计算机是四核的,所以NumWorkers=4!但是一个优秀的码农应该在使用前 parpool开启并行池,使用后delete关闭并行池。很明显,我不是
。)
我们看到两种循环语句运行的结果是不一样的,parfor是不能保证迭代是按顺序进行的!
(1):parfor的使用场合:
上面的例子是一个迭代次数少的循环过程,体现不出parfor优势,而且 parfor在运行时还涉及底层的通信,因此在这种时候使用 parfor可能还会得不偿失。 但是当进行蒙特卡洛模拟这些冗长的算法的时候,parfor就可以体现自己的优势了。 parfor 的使用限制包括:1:不可以在 parfor循环里面再次使用 parfor;2:每个迭代都必须独立于其他迭代。(我的理解就是工头给每个工人分配任务,工人的数量就是NumWorkers,工头对每个工人都是公正的,所以分配任务parfor的时候每个工人领到的任务是随机的。每个工人只和工头交流,工人和工人没有交流,这就意味着每个工人领到的任务都是可以自己独立完成的。工人是最低的层次,他们下面没有其他的阶级,这就意味着工人只能接受工头的任务,但不能再分配parfor自己已经得到的任务!)
(2):嵌套循环的parfor写法:
for循环里面可以嵌套for循环,但是parfor循环里面不可以嵌套 parfor循环,这是for和 parfor的又一不同之处。用 parfor改写嵌套循环有三种方法:
方法一:
方法二:
但是吧,这两种方法都不能把parfor的作用发挥的淋漓尽致,于是乎,有了第三种方法:
、
但是有时候我们在做嵌套循环的时候,会涉及二维数组的处理,用第三种方法得到的ij通过双下标的方式来访问二维数组就会报错,这个时候是有另外一种解决办法的!
(3):parfor里面的变量:
parfor里面一共有五种变量,分别是loop,sliced,broadcast,reduction和temporary,当一个parfor循环里面的变量不能被划分到其中一种的时候,就会出错!在这里,先呈上各个变量的英语解释!
loop是循环变量,应该挺好理解的;broadcast变量是在循环之前定义的变量,在循环中只取值,并不指定新的值;temporary变量是在循环中定义的变量,有且仅在循环中有效,在循环之外无效,还有一点就是它并不影响循环之前定义的同名变量;sliced变量,有人管它叫切片变量(个人感觉这个名字怪怪的),在很多时候是指数组了。reduction变量是一个最后的结果和运算顺序无关的量,它的产生涉及到简约运算符和一定的规则,然后笔者才疏学浅,就不介绍了,哈哈哈!
相关文章推荐
- matlab中的并行方法与理解(2):parfor中的变量类型
- [转自http://jhtchina.cnblogs.com/]Dev里面DataGid控件使用方法之一
- 一段效率很高的for循环语句使用方法
- MATLAB Builder for Java 使用初始
- Boson NetSim for CCNP 7.06使用方法
- MATLAB bulider for JAVA 使用TOMCAT 进行远程部署
- VC编译器使用Matlab_Com组件的方法
- FCKeditor 的配置和使用方法(for PHP)
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 老外编的程序(八):在CSharp里面使用Http Get方法
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法-------wince里面的中断IST经常使用。
- LOTUS/DOMINO学习笔记之@for和@elements的使用方法
- 多线程访问文件问题中WaitForSingleObject方法的使用,及其效率!
- Dev里面DataGid控件使用方法之一
- JavaScript For...In 使用方法
- Dev里面DataGid控件使用方法之一
- Dev里面DataGid控件使用方法之一
- 【转】matlab 使用的一点儿体会(for beginner)
- USING STATIC IMPORTS FOR CONSTANTS AND METHODS(使用静态导入引用常量与方法)