使用Parallel Computing Toolbox™,您可以在不同的并行环境中运行并行代码,例如基于线程的或基于进程的环境。这些环境提供了不同的优势。
注意,基于线程的环境只支持MATLAB的一个子集金宝app®流程工作者可用的功能。如果您对不受支持的函数感兴趣,请使用金宝appMathWorks技术支持金宝app团队知道。有关支持的更多信息,请参见金宝app检查对基于线金宝app程的环境的支持.
根据您选择的并行环境类型,特性可以在进程工作器或线程工作器上运行。要确定哪个环境适合您,请参考下面的图表和表。
使用并行池特性,例如parfor
或parfeval
,在选择的环境中创建并行池,使用parpool
函数。
环境 | 建议 | 例子 |
---|---|---|
本地机器上的基于线程的环境 | 使用这种设置可以减少内存使用、更快的调度和更低的数据传输成本。 |
parpool (“线程”)
请注意 如果你选择 要确定是否可以从基于线程的池中获得足够的好处,可以使用 |
本地机器上的基于进程的环境 | 在扩展到集群或云之前,对大多数用例和原型使用此设置。 |
parpool (“本地”)
|
远程集群上基于进程的环境 | 使用此设置可按比例扩大计算。 |
parpool (“MyCluster”)
MyCluster 集群配置文件的名称。 |
使用集群特性,例如批处理
,在选择的环境中创建集群对象parcluster
函数。注意,集群特性仅在基于流程的环境中受支持。金宝app
环境 | 建议 | 例子 |
---|---|---|
本地机器上的基于进程的环境 | 如果您有足够的本地资源,或者在扩展到集群或云之前进行原型,请使用此设置。 |
parcluster (“本地”)
|
远程集群上基于进程的环境 | 使用此设置可按比例扩大计算。 |
parcluster (“MyCluster”)
在哪里 |
建议
建议默认为基于进程的环境。
它们支持完金宝app整的并行语言。
它们与以前的版本向后兼容。
在发生崩溃的情况下,它们更加稳健。
外部库不需要线程安全。
在以下情况下选择基于线程的环境:
基于线程的环境支持并行代码。金宝app
您希望减少内存使用量、更快的调度和更低的数据传输成本。
下面展示了进程工作器和线程工作器之间的性能比较,以利用线程工作器的效率。
创建一些数据。
X = rand(10000, 10000);
创建一个并行的进程工作者池。
池= parpool (“本地”);
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。
对并行代码的执行和数据传输进行计时。对于本例,使用aparfeval
执行。
ticBytes(池);tProcesses = timeit(@() fetchOutputs(parfeval(@sum,1,X,))“所有”))) tocBytes(池)
tProcesses = 3.9060 bytesenttoworkers BytesReceivedFromWorkers __________________ ________________________ 1 0 0 2 0 0 3 0 0 4 0 0 5 5.6e+09 16254 60 0 Total 5.6e+09 16254
注意,数据传输是重要的。为了避免发生数据传输成本,可以使用线程工作器。删除当前并行池,并创建一个基于线程的并行池。
删除(池);池= parpool (“线程”);
计算运行相同代码所需的时间。
tThreads = timeit(@() fetchOutputs(parfeval(@sum,1,X,))“所有”)))
tThreads = 0.0232
比较次。
流('如果没有数据传输,此示例为%。2外汇更快。\ n”tProcesses / tThreads)
如果不进行数据传输,这个示例的速度将提高168.27倍。
线程工作程序优于进程工作程序,因为线程工作程序可以使用数据X
不复制它,他们有更少的调度开销。
这个示例展示了如何使用基于进程和基于线程的池并行地解决优化问题。基于线程的池进行了优化,以减少数据传输、更快的调度和减少内存使用,因此它们可以提高应用程序的性能。
问题描述
问题是改变火炮的位置和角度,让炮弹尽可能地飞出墙外。炮口初速为300米/秒。墙有20米高。如果加农炮离墙太近,就会以太陡的角度发射,射弹也不会飞得足够远。如果加农炮离墙太远,炮弹就飞得不够远。有关问题的详细信息,请参见并行优化ODE(全局优化工具箱)或者视频的后半部分代理优化.
MATLAB问题公式化
要想解决问题,请拨打电话patternsearch
求解器从全局优化工具箱。目标函数在cannonobjective
辅助函数,用于计算在给定位置和角度下炮弹落在墙外的距离。约束条件是cannonconstraint
辅助函数,用于计算炮弹是否击中墙壁,甚至在击中地面之前是否到达墙壁。helper函数位于单独的文件中,您可以在运行此示例时查看这些文件。
为。设置以下输入patternsearch
解算器。注意,要使用并行计算工具箱,必须设置“UseParallel”
来真正的
在优化选项中。
磅= (-200;0.05);乌兰巴托=(1;π/ 2 . 05);x0 =(-30,π/ 3);选择= optimoptions (“patternsearch”,...“UseCompletePoll”,真的,...“显示”,“关闭”,...“UseParallel”,真正的);没有线性约束,所以设置这些输入为空:一个= [];b = [];Aeq = [];说真的= [];
基于流程的池解决方案
为了进行比较,请先在基于进程的并行池上解决问题。
启动一个并行的进程工作者池。
p = parpool (“本地”);
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。
要在以后重新进行相同的计算,请在随机生成器中设置默认值。
rng默认的;
使用一个循环来解决问题几次,并平均结果。
tProcesses = 0(5、1);为重复= 1:numel(tProcesses) tic [xsolution,distance,eflag,outpt] = patternsearch(@cannonobjective,x0, x0)...说真的,A、b Aeq磅,乌兰巴托,@cannonconstraint,选择);tProcesses = toc(重复);结束tProcesses =意味着(tProcesses)
tProcesses = 2.7677
要准备与基于线程的池进行比较,请删除当前的并行池。
删除(p);
基于线程的池解决
启动一个并行线程工作器池。
p = parpool (“线程”);
启动平行池(parpool)…连接到并行池(工作人员数量:6)。
将随机数生成器恢复为默认设置,并运行与前面相同的代码。
rng默认的tThreads = 0(5、1);为重复= 1:numel(tThreads) tic [xsolution,distance,eflag,outpt] = patternsearch(@cannonobjective,x0, x0)...说真的,A、b Aeq磅,乌兰巴托,@cannonconstraint,选择);tThreads = toc(重复);结束tThreads =意味着(tThreads)
tThreads = 1.5790
比较线程执行程序和进程执行程序的性能。
流('在本例中,thread workers是%。2fx比进程工人更快。tProcesses / tThreads)
在本例中,线程工作程序比进程工作程序快1.75倍。
请注意,由于对基于线程的池进行了优化,性能得到了提高。
当您完成计算时,删除并行池。
删除(p);
在基于线程的环境中,并行语言特性运行在由计算线程支持的工作人员上,这些工作人员在机器的核心上运行代码。它们与计算进程的不同之处在于它们共存于同一个进程中,并且可以共享内存。
与基于进程的环境相比,基于线程的环境具有以下优点。
因为线程工作人员可以共享内存,他们可以在不复制的情况下访问数值数据,所以它们的内存效率更高。
线程之间的通信消耗的时间更少。因此,调度任务或工人间通信的开销更小。
当您使用基于线程的环境时,请记住以下注意事项。
检查您的代码是否支持基于线程的环境。金宝app有关更多信息,请参见检查对基于线金宝app程的环境的支持.
如果使用来自worker的外部库,则必须确保库函数是线程安全的。
在基于进程的环境中,并行语言特性运行在由计算进程支持的工作人员上,这些工作人员在机器的核心上运行代码。它们不同于计算线程,因为它们彼此独立。
与基于线程的环境相比,基于进程的环境具有以下优点。
它们支持所金宝app有的语言特性,并且向后兼容以前的版本。
在发生崩溃的情况下,它们更加稳健。如果进程工作者崩溃,那么MATLAB客户端不会崩溃。如果进程工作程序崩溃,而您的代码无法使用spmd
或分布式数组,则其余的工作人员可以继续运行。
如果您使用来自worker的外部库,那么您就不需要注意线程安全。
您可以使用集群特性,例如批处理
.
当您使用基于流程的环境时,请记住以下注意事项。
如果您的代码访问工人的文件,那么您必须使用其他选项,例如“AttachedFiles”
或“AdditionalPaths”
,以使数据可访问。
线程工作程序只支持进程工作程序金宝app可用的MATLAB函数的一个子集。如果您对不受支持的函数感兴趣,请使用金宝appMathWorks技术支持金宝app团队知道。
使用金宝appMATLAB编译器™和web应用程序托管MATLAB Web应用服务器™.
有关线程工作程序支持的函数的更多信息,请参见金宝app在线程环境中运行MATLAB函数.