与并行计算工具箱™,您可以运行并行代码在不同的并行环境,比如线程或基于流程的环境。这些环境提供不同的优势。
请注意,线程只有一个子集的MATLAB环境支持金宝app®函数用于过程的工人。如果你有兴趣在一个不支持的功能,让金宝appMathWorks技术支持金宝app团队知道。有关支持的更多信息,请参阅金宝app检查支持线程金宝app的环境。
根据并行环境的类型选择、功能过程的工人或工人线程上运行。决定哪些环境是否适合你,请参考下面的图和表。
使用并行池特性,比如parfor
或parfeval
,创建一个平行池在选择环境中使用parpool
函数。
环境 | 建议 | 例子 |
---|---|---|
线程环境在本地机器上 | 使用这个设置减少内存使用,更快的调度,降低数据传输成本。 |
parpool (“线程”)
请注意 如果你选择 发现如果你能得到足够的从线程池中获益,测量数据传输的基于流程的池 |
基于流程的环境在本地机器上 | 使用这个设置对大多数用例和原型在扩展集群或云。 |
parpool (“本地”)
|
基于流程的远程集群环境 | 使用这个设置扩大你的计算。 |
parpool (“MyCluster”)
MyCluster 是一个集群的配置文件的名称。 |
使用集群特性,比如批处理
,创建一个集群对象选择的环境中使用parcluster
函数。注意,只在基于流程的环境支持集群功能。金宝app
环境 | 建议 | 例子 |
---|---|---|
基于流程的环境在本地机器上 | 使用这个设置如果你有足够的当地资源,或原型在扩展集群或云。 |
parcluster (“本地”)
|
基于流程的远程集群环境 | 使用这个设置扩大你的计算。 |
parcluster (“MyCluster”)
在哪里 |
建议
违约建议基于流程的环境。
他们支持完金宝app整的并行语言。
他们是向后兼容以前版本。
他们更健壮的崩溃。
外部库不需要线程安全的。
选择线程环境时:
并行代码是由线程环境。金宝app
你想要减少内存使用,更快的调度和数据传输成本降低。
下面显示了进程工人和线程之间的性能比较工人为例,利用线程工人的效率。
创建一些数据。
X =兰德(10000、10000);
创建一个平行的过程的工人。
池= parpool (“本地”);
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。
时间的执行和衡量数据传输一些并行代码。对于这个示例,使用parfeval
执行。
ticBytes(池);tProcesses时间= (@ ()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.6 e + 16254年09年6 0 0 5.6 e + 09年16254
注意,数据传输是重要的。为了避免数据传输成本,您可以使用线程的工人。删除当前并行池并创建一个线程并行池。
删除(池);池= parpool (“线程”);
时间运行相同的代码需要多长时间。
tThreads时间= (@ ()fetchOutputs (parfeval (@sum 1 X,“所有”)))
tThreads = 0.0232
比较次。
流(“没有数据传输,这个例子是%。2外汇更快。\ n”tProcesses / tThreads)
没有数据传输,这个例子是快168.27倍。
线程的工人比进程工人因为线程可以使用数据X
没有复制,调度开销少。
这个例子展示了如何使用一个基于流程和并行线程池来解决优化问题。线程池的优化数据传输低,更快的调度,和减少内存使用,所以他们可能会导致应用程序性能。
问题描述
问题是改变炮发射弹丸的位置和角度尽可能超越了一堵墙。大炮初速300米/秒。墙上是20米高。如果炮太靠近墙壁,这大火太陡峭的一个角,弹不足够远的旅行。如果太远从墙上大炮,弹不足够远的旅行。完整的细节问题,看到并行优化的颂歌(全局优化工具箱)或视频的后半部分代理优化。
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 (“本地”);
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。
复制相同的计算后,种子随机发生器与默认值。
rng默认的;
使用循环来解决这个问题几次和平均结果。
tProcesses = 0 (5、1);为重复= 1:元素个数(tProcesses)抽搐(xsolution、距离、eflag outpt] = patternsearch (x0, @cannonobjective…说真的,A、b Aeq磅,乌兰巴托,@cannonconstraint,选择);tProcesses = toc(重复);结束tProcesses =意味着(tProcesses)
tProcesses = 2.7677
准备与一个线程池,删除当前并行池。
删除(p);
解决在线程池
开始一个并行的线程池的工人。
p = parpool (“线程”);
开始平行池(parpool)…连接到平行池(工人数量:6)。
恢复默认设置随机数生成器和运行相同的代码。
rng默认的tThreads = 0 (5、1);为重复= 1:元素个数(tThreads)抽搐(xsolution、距离、eflag outpt] = patternsearch (x0, @cannonobjective…说真的,A、b Aeq磅,乌兰巴托,@cannonconstraint,选择);tThreads = toc(重复);结束tThreads =意味着(tThreads)
tThreads = 1.5790
线程的工人和过程的性能进行比较。
流(在这个例子中,线程工人%。2外汇速度比过程工人。\ n”tProcesses / tThreads)
在这个例子中,线程的工人比过程快1.75倍。
注意到性能优化的线程池。
当你完成了计算,删除平行池。
删除(p);
在线程环境中,并行语言特性由计算线程上运行工人,核心在机器上运行代码。他们不同于他们共处在同一个过程中计算过程,可以共享内存。
线程环境有以下优势基于流程的环境。
因为工人线程可以共享内存,他们可以访问数字数据没有复制,所以他们更多的内存效率。
线程之间的通信不太费时。因此,调度任务或inter-worker通信的开销更小。
当你使用线程环境,记住以下注意事项。
检查您的代码是支持一个线程环境。金宝app有关更多信息,请参见检查支持线程金宝app的环境。
如果您使用的是外部库从工人,那么你必须确保库函数是线程安全的。
在基于流程的环境中,并行语言特性上运行工人所支持的计算过程,核心在机器上运行代码。他们不同于计算线程,它们是相互独立的。
基于流程的环境有以下优势线程环境。
他们支持所金宝app有语言特性,向后兼容以前版本。
他们更健壮的崩溃。如果一个工人崩溃过程,那么MATLAB客户端不崩溃。如果一个过程工人崩溃和代码没有使用spmd
或分布式阵列,然后剩下的工人可以继续运行。
如果你从工人使用外部的库,那么你不需要注意线程安全。
您可以使用集群特性,比如批处理
。
当你使用一个基于流程的环境,记住以下考虑。
如果您的代码访问文件从工人,那么您必须使用额外的选项,如“AttachedFiles”
或“AdditionalPaths”
,使数据访问。
线工人支持只有一个子集的MAT金宝appLAB函数可用于过程的工人。如果你有兴趣在一个不支持的功能,让金宝appMathWorks技术支持金宝app团队知道。
线程支持工人在使用创建独立的应用程序金宝appMATLAB编译器™和web应用程序驻留在MATLAB™Web应用程序服务器。
关于线程函数支持工人的更多信息,见金宝appMATLAB函数线程环境中运行。