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