使用Parallel Computing Toolbox™,您可以在不同的并行环境中运行并行代码,例如基于线程或基于进程的环境。这些环境提供了不同的优势。
注意,基于线程的环境只支持MATLAB的一个子集万博1manbetx®流程工人可用的功能。如果您对不支持的函数感兴趣,则让万博1manbetxMathWorks的技术支持万博1manbetx小组。有关支持的详细信息,请参阅万博1manbetx检查支持基于万博1manbetx线程的环境。
根据您选择并行环境的类型,功能运行在任一过程的工人或线程的工人。要决定哪些环境适合你,请参阅下面的图和表。
使用并行池的功能,如PARFOR
要么parfeval
中,通过使用在创建所选择的环境中的并行池parpool
功能。
环境 | 建议 | 例子 |
---|---|---|
本地机器上基于线程的环境 | 使用此设置,可降低存储器使用,更快的调度,和更低的数据传输的成本。 |
parpool (“线程”)
注意如果你选择 要了解您是否可以从基于线程池获得足够的益处,测量数据与基于流程的池转移 |
本地计算机上的基于流程的环境 | 使用此设置对于大多数使用情况和扩展到集群或云之前原型。 |
parpool ('本地')
|
远程集群上基于进程的环境 | 使用此设置来扩大你的计算。 |
parpool ('MYCLUSTER')
MYCLUSTER 集群配置文件的名称。 |
使用簇的功能,如批量
中,通过使用在创建所选择的环境中的群集对象parcluster
功能。请注意,集群功能在基于过程的环境中只支持。万博1manbetx
环境 | 建议 | 例子 |
---|---|---|
本地计算机上的基于流程的环境 | 如果您有足够的本地资源,那么就使用这个设置,或者在扩展到集群或云之前使用原型。 |
parcluster('本地')
|
远程集群上基于进程的环境 | 使用此设置来扩大你的计算。 |
parcluster('MYCLUSTER')
哪里 |
建议默认为基于流程的环境。
它们支持全万博1manbetx并行语言。
它们与以前的版本向后兼容。
在发生撞车事件时,它们会更加稳健。
外部库不需要是线程安全的。
选择基于线程的环境:
您的并行代码是基于线程的环境支持。万博1manbetx
您希望减少内存使用、更快的调度和更低的数据传输成本。
下面示出了用于一个利用螺纹工人的工作效率的示例性过程的工人和螺纹工人之间的性能比较。
创建一些数据。
X = rand(10000, 10000);
创建流程工作者的并行池。
池= parpool('本地');
使用“本地”配置文件启动并行池(parpool)…连接到并行池(worker数量:6)。
为一些并行代码的执行计时并测量数据传输。对于本例,使用parfeval
执行。
ticBytes(池);tProcesses = timeit(@()fetchOutputs(parfeval(@总和,1,X,“所有”)))tocBytes(池)
tProcesses = 3.9060 BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 0 0 2 0 0 3 0 0 4 0 0 5 5.6E + 09 16254 6 0 0总计5.6E + 09 16254
需要注意的是数据传输显著。为了避免产生数据传送费用,您可以使用线程的工人。删除当前并行,并创建一个基于线程的并行池。
删除(池);池= parpool(“线程”);
时间相同的代码需要多长时间运行。
tThreads = timeit(@()fetchOutputs(parfeval(@总和,1,X,“所有”)))
tThreads = 0.0232
比较两者的时间。
fprintf中(“没有数据传输,这个例子是%.2fx更快。\ N”,tProcesses / tThreads)
如果没有数据传输,这个例子是168.27x更快。
螺纹工人跑赢进程工人,因为工人线程可以使用数据X
不需要复制它,并且它们有更少的调度开销。
这个例子说明了如何使用基于线程池并行来解决优化问题。基于线程池少的数据传输,更快的调度,并减少内存使用进行了优化,所以他们可能会导致应用程序中的性能增益。
此示例要求全局优化工具箱。
问题描述
问题是要改变大炮的位置和角度,以尽可能火炮弹超出了墙。大炮具有300μm的初速/秒。壁为20米高。如果大炮太靠近墙壁,它激发在太陡的角度,以及抛射不出远门不够。如果大炮是从墙壁太远,弹不出远门不够。有关完整的问题的详细信息,请参阅优化并行的ODE(全局优化工具箱)或视频的后半部分代孕优化。
MATLAB问题描述
要解决这个问题,打电话给patternsearch
全局优化工具箱中的求解器。目标函数在cannonobjective
辅助函数,其计算的距离超过所述壁对于给定的位置和角度的弹丸的土地。约束是在cannonconstraint
辅助函数,计算弹丸是否击中墙,甚至在落地前是否到达墙。helper函数位于单独的文件中,您可以在运行此示例时查看这些文件。
设置在下面输入patternsearch
解算器。注意,要使用并行计算工具箱,必须设置UseParallel
至真正
在优化选项。
LB = [-200; 0.05];UB = [-1; PI / 2-0.05];X0 = [-30,PI / 3];OPTS = optimoptions(“patternsearch”,...'UseCompletePoll',真实,...'显示',“关闭”,...'UseParallel',真正);%未线性约束,所以设置这些输入空:A = [];B = [];AEQ = [];BEQ = [];
解决上基于过程的池
为了进行比较,首先解决在基于过程的并行池的问题。
启动流程工作者的并行池。
P = parpool('本地');
使用“本地”配置文件启动并行池(parpool)…连接到并行池(worker数量:6)。
要在以后重现相同的计算,请在随机生成器中植入默认值。
RNG默认;
使用循环来解决这个问题多次和平均结果。
tProcesses =零(5,1);对于重复= 1:numel(tProcesses)抽动[xsolution,距离,EFLAG,OUTPT] = patternsearch(@ cannonobjective,X0,...说真的,A、b Aeq磅,乌兰巴托,@cannonconstraint,选择);tProcesses = toc(重复);结束tProcesses =平均值(tProcesses)
tProcesses = 2.7677
接下来与基于线程池来比较,删除当前并行池。
删除(P);
解决在基于线程池
启动线程的工人并行池。
P = parpool(“线程”);
启动并行池(parpool)…连接到并行池(worker数量:6)。
将随机数生成器重设为默认设置,并运行与前面相同的代码。
RNG默认tThreads = 0 (5、1);对于重复= 1:numel(tThreads)抽动[xsolution,距离,EFLAG,OUTPT] = patternsearch(@ cannonobjective,X0,...说真的,A、b Aeq磅,乌兰巴托,@cannonconstraint,选择);tThreads = toc(重复);结束tThreads =平均值(tThreads)
tThreads = 1.5790
比较线程工人和工人处理的性能。
fprintf中(在本例中,线程工作者为%。2fx比流程工人快。\n',tProcesses / tThreads)
在这个例子中,线程工作者比进程工作者快1.75倍。
请注意,由于基于线程池的优化性能增益。
当你与计算完成后,删除并行池。
删除(P);
在基于线程的环境中,并行语言功能运行在由计算线程,从而在一台机器上运行的内核代码的支持人员。他们从计算过程的区别在于它们在同一进程内共存并可以共享存储器。
基于线程的环境中有超过基于过程的环境具有以下优点。
由于螺纹工人能共享内存,他们可以访问数字数据,而无需拷贝,所以他们更多的内存效率。
线程之间的通信是耗时更少。因此,调度任务或工人间通信的开销较小。
在使用基于线程的环境时,请记住以下注意事项。
检查您的代码是否支持基于线程的环境。万博1manbetx有关更多信息,请参见检查支持基于万博1manbetx线程的环境。
如果您正在使用外部库从工人,则必须确保库函数是线程安全的。
在基于进程的环境中,并行语言特性在由计算进程支持的工作程序上运行,计算进程在机器的核心上运行代码。它们与计算线程的区别在于它们是相互独立的。
基于流程的环境中有超过基于线程的环境具有以下优点。
它们支持所万博1manbetx有语言特性,并向后兼容以前的版本。
在发生撞车事件时,它们会更加稳健。如果进程工作者崩溃了,那么MATLAB客户机不会崩溃。如果进程工作人员崩溃,而您的代码没有使用SPMD
或分布式数组,那么其余的workers就可以继续运行。
如果使用worker的外部库,那么就不需要注意线程安全。
您可以使用集群特性,例如批量
。
当您使用基于流程的环境,请注意以下考虑考虑。
如果您的代码从workers访问文件,那么您必须使用其他选项,例如“AttachedFiles”
要么“AdditionalPaths”
,使数据访问。
线程工作程序只支持进程工作程序万博1manbetx可用的MATLAB函数的一个子集。如果您对不支持的函数感兴趣,则让万博1manbetxMathWorks的技术支持万博1manbetx小组。
所支持的并行语言功能万博1manbetxparpool
,PARFOR
,parfeval
,parfevalOnAll
,高
和parallel.pool.Constant
,受到以下限制。
基于线程的并行池不具有相关联的集群对象。
afterEach
和毕竟
不支持。万博1manbetx
FevalQueue
不支持。万博1manbetx
高大的阵列不支持万博1manbetx写
并且只支万博1manbetx持表格文本和内存输入。
其他并行语言特性,包括SPMD
,分布式
和parallel.pool.DataQueue
,不支持。万博1manbetx
在一般情况下,MATLAB的许多核心功能都支持,其中包括:万博1manbetx
语言基础知识
数学
核心数据类型(双,单,逻辑的,整数类型,字符,单元阵列,串,表,时间表,分类,日期时间,和持续时间)
控制流和逻辑(例如,如果,循环,和while循环)
脚本、函数和类
自定义类
在一般情况下,功能之外的修改或访问的东西线工人的不支持,其中包括:万博1manbetx
数据导入和导出
图形
外部语言
尝试在基于线程的池中运行代码。MATLAB在遇到不支持的函数时会显示错误消息。万博1manbetx