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