选择基于线程的环境和基于进程的环境
使用并行计算工具箱™,您可以在不同的并行环境中运行并行代码,例如基于线程或基于进程的环境。这些环境提供了不同的优势。
注意,基于线程的环境只支持MATLAB的一个子集金宝app®流程工作者可用的函数。如果对不受支持的函数感兴趣,请使用金宝appMathWorks技术支持金宝app团队知道。有关支持的详细信息,请参见金宝app检查是否支持金宝app基于线程的环境.
选择并行环境
根据所选择的并行环境类型,特性可以在进程工作者或线程工作者上运行。要决定哪种环境适合您,请参考下面的图表和表格。
使用并行池特性,例如
parfor
或parfeval
,在所选环境中创建一个并行池parpool
函数。环境 建议 例子 本地机器上基于线程的环境 使用此设置可减少内存使用、加快调度和降低数据传输成本。
parpool (“线程”)
请注意
如果你愿意
“线程”
,检查你的代码是否被支持。金宝app有关更多信息,请参见检查是否支持金宝app基于线程的环境.要确定是否可以从基于线程的池中获得足够的好处,请使用
ticBytes
而且tocBytes
.如果数据传输比较大,比如超过100mb,则使用“线程”
.本地机器上基于进程的环境 在扩展到集群或云之前,将此设置用于大多数用例和原型。
parpool (“过程”)
远程集群上基于进程的环境 使用此设置可扩展计算。
parpool (“MyCluster”)
MyCluster
集群配置文件的名称。使用集群特性,例如
批处理
,在所选环境中创建集群对象parcluster
函数。注意,集群特性仅在基于流程的环境中受支持。金宝app环境 建议 例子 本地机器上基于进程的环境 如果您有足够的本地资源,可以使用此设置,或者在扩展到集群或云之前进行原型设计。
parcluster (“过程”)
远程集群上基于进程的环境 使用此设置可扩展计算。
parcluster (“MyCluster”)
在哪里
MyCluster
集群配置文件的名称。
建议
建议默认使用基于流程的环境。
它们支持完金宝app整的并行语言。
它们与以前的版本向后兼容。
它们在崩溃的情况下更加强健。
外部库不需要是线程安全的。
选择基于线程的环境:
基于线程的环境支持并行代码。金宝app
您希望减少内存使用、更快的调度和更低的数据传输成本。
比较进程工作者和线程工作者
下面是一个利用线程工作者效率的示例,展示了进程工作者和线程工作者之间的性能比较。
创建一些数据。
X =兰特(10000,10000);
创建流程工作者的并行池。
Pool = parpool(“过程”);
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:6)。
对一些并行代码的执行和数据传输进行计时。对于本例,使用aparfeval
执行。
ticBytes(池);tProcesses = timeit(@() fetchOutputs(parfeval(@sum,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 60 0 Total 5.6e+09 16254
请注意,数据传输非常重要。为了避免招致数据传输成本,您可以使用线程工作线程。删除当前的并行池,创建基于线程的并行池。
删除(池);Pool = 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”
来真正的
在优化选项中。
Lb = [-200;0.05];Ub = [-1;pi/2-.05];X0 = [-30,pi/3];Opts = optimoptions(“patternsearch”,...“UseCompletePoll”,真的,...“显示”,“关闭”,...“UseParallel”,真正的);没有线性约束,所以将这些输入设置为空:A = [];B = [];Aeq = [];Beq = [];
基于过程的池求解
为了便于比较,请先在基于流程的并行池上解决问题。
启动流程工作者的并行池。
P = parpool(“过程”);
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:6)。
为了以后重现相同的计算,请使用默认值为随机生成器提供种子。
rng默认的;
使用循环多次解决问题,并对结果求平均。
tProcesses = 0 (5,1);为repeat = 1: nummel (tProcesses) tic [xsolution,distance,eflag,outpt] = patternsearch(@cannonobjective,x0,...说真的,A、b Aeq磅,乌兰巴托,@cannonconstraint,选择);tProcesses(repeat) = toc;结束tProcesses = mean(tProcesses)
tProcesses = 2.7677
为了与基于线程的池进行比较,请删除当前的并行池。
删除(p);
基于线程池的求解
启动线程工作者的并行池。
P = parpool(“线程”);
启动并行池(parpool)使用'Threads'配置文件…连接到并行池(工人数:6)。
将随机数生成器恢复为默认设置,并运行与前面相同的代码。
rng默认的tThreads = 0 (5,1);为repeat = 1: nummel (tThreads) tic [xsolution,distance,eflag,outpt] = patternsearch(@cannonobjective,x0,...说真的,A、b Aeq磅,乌兰巴托,@cannonconstraint,选择);tThreads(repeat) = toc;结束tThreads = mean(tThreads)
tThreads = 1.5790
比较螺纹工人和工艺工人的工作表现。
流(在本例中,线程工作者为%。比加工工人快2fx。\n'tProcesses / tThreads)
在这个例子中,线程工作者比进程工作者快1.75倍。
请注意基于线程的池的优化带来的性能增益。
计算完成后,删除并行池。
删除(p);
什么是基于线程的环境?
在基于线程的环境中,并行语言特性运行在由计算线程支持的工作线程上,计算线程在机器的核心上运行代码。它们与计算进程的不同之处在于它们共存于同一个进程中,并且可以共享内存。
与基于进程的环境相比,基于线程的环境具有以下优势。
因为线程工作者可以共享内存,所以它们可以在不复制的情况下访问数值数据,因此它们的内存效率更高。
线程之间的通信更节省时间。因此,调度任务或工作人员之间通信的开销更小。
当您使用基于线程的环境时,请记住以下注意事项。
检查基于线程的环境是否支持您的代码。金宝app有关更多信息,请参见检查是否支持金宝app基于线程的环境.
如果使用来自工作者的外部库,则必须确保库函数是线程安全的。
什么是基于流程的环境?
在基于进程的环境中,并行语言特性运行在受计算进程支持的工作线程上,计算进程在机器的核心上运行代码。它们与计算线程的不同之处在于它们彼此独立。
与基于线程的环境相比,基于进程的环境具有以下优势。
它们支持所金宝app有语言特性,并向后兼容以前的版本。
它们在崩溃的情况下更加强健。如果进程worker崩溃,那么MATLAB客户端不会崩溃。如果进程worker崩溃,而您的代码无法使用
spmd
或者分布式数组,那么剩下的工作线程可以继续运行。如果使用来自worker的外部库,则不需要注意线程安全。
您可以使用集群特性,例如
批处理
.
当您使用基于流程的环境时,请记住以下考虑事项。
如果您的代码访问来自工作者的文件,那么您必须使用其他选项,例如
“AttachedFiles”
或“AdditionalPaths”
,以便查阅资料。
检查是否支持金宝app基于线程的环境
线程工作者只支持进程工作者可用金宝app的MATLAB函数的一个子集。如果对不受支持的函数感兴趣,请使用金宝appMathWorks技术支持金宝app团队知道。
在使用。创建的独立应用程序中支持线程工金宝app作者MATLAB编译器™和网络应用托管MATLAB Web应用程序服务器™.
有关线程工作线程支持的函数的详细信息,请参见金宝app在线程环境中运行MATLAB函数.