当Matlab启动一个";并行池;?
在Matlab中运行并行CPU进程从以下命令开始当Matlab启动一个";并行池;?,matlab,parallel-processing,Matlab,Parallel Processing,在Matlab中运行并行CPU进程从以下命令开始 parpool() 根据报告,该职能: [创建]工人池上的特殊作业,并[连接]MATLAB客户端到并行池 此函数通常需要一点时间来执行,大约30秒。但在其他多CPU模式(如OpenMP)中,并行执行似乎完全透明——我从未注意到任何类似于Matlab的行为(尽管我对并行编程不是很有经验) 那么,在调用parpool()和它完成执行之间实际发生了什么?怎么这么久 老实说,我认为我们永远不会确切知道MatLab的功能 然而,为了给你一些答案,MatL
parpool()
根据报告,该职能:
[创建]工人池上的特殊作业,并[连接]MATLAB客户端到并行池
此函数通常需要一点时间来执行,大约30秒。但在其他多CPU模式(如OpenMP)中,并行执行似乎完全透明——我从未注意到任何类似于Matlab的行为(尽管我对并行编程不是很有经验)
那么,在调用
parpool()
和它完成执行之间实际发生了什么?怎么这么久 老实说,我认为我们永远不会确切知道MatLab的功能
然而,为了给你一些答案,MatLab基本上打开了它自己的其他实例,让它在上面执行代码。为了做到这一点,它首先需要检查应该在哪里打开实例(您可以将集群从本地更改为您可以访问的任何其他集群,例如Amazons EC2集群)。一旦新实例被打开,MatLab就会设置从主窗口到实例的连接
注:
1) 不建议在函数或脚本中使用parpool
,因为如果在并行池打开时运行,则会引发错误。使用并行命令,例如parfor
将自动打开实例
2) parpool
只需执行“一次”(在关闭前),即如果再次运行代码,实例已经打开
3) 如果希望避免代码中的开销,可以在MATLAB的搜索路径中创建一个名为startup.m的文件,使用命令parpool
,这将在启动时自动启动并行池
4) 矢量化代码将自动使其并行化,而不会产生额外的开销。关于@Nicky的回答,我们将进一步介绍一些细节。创建并行池包括:
'local'
和所有其他集群类型的情况下)spmd
(除非在启动池时指定“'SpmdEnabled',false
”——但是,此阶段通常不是性能瓶颈)parpool
和OpenMP之间的开销差异是因为parpool
通常会启动额外的MATLAB进程,这是一个相对较重的操作,而OpenMP只是在单个进程中创建额外的线程,相对较轻。此外,正如@Nicky指出的那样,MATLAB本质上可以对一些/大多数向量化操作执行多线程操作-parpool
对于这种情况不会发生的情况非常有用,或者您可以在真正的多节点集群上运行 并行计算工具箱使您能够使用几种不同的范例(例如作业和任务,parfor
,spmd
,parfeval
,批处理)并行运行MATLAB代码,并在本地(在本地机器中跨内核并行)或远程运行(在集群中的多台机器之间进行并行化——要么是您自己的机器,要么是云中的机器)
在任何一种情况下,代码都在MatlabWorkers上运行,这些workers基本上是MATLAB的副本,没有交互式桌面
如果您打算在远程群集上运行,则这些辅助进程可能已经启动并准备好运行代码。如果您打算在本地运行,则可能已经启动了辅助进程,但可能尚未启动
上面的一些构造(例如作业和任务、批处理)只运行您要求的内容,然后工作人员返回到可用于其他内容(可能来自不同的用户)
但是,一些构造(例如,parfor
,spmd
)要求将要运行的工作线程保留一段时间,部分原因是它们可能会闲置一段时间,您不希望被其他用户接管,部分原因是(与作业和任务或批处理不同)它们可能需要相互通信。这称为创建工作池
当您运行parpool
时,您告诉MATLAB您想为自己保留一个工作池,因为您打算运行一个需要工作池的构造。您可以指定一个集群概要文件作为输入参数,它将告诉您是要在远程集群上运行还是在本地运行
如果您在集群上运行,parpool
将向集群发送一条消息,以保留一些(已经运行的)工作线程供您使用
如果您在本地运行,parpool
将确保有足够的工人在本地运行,然后为您将他们连接到一个池中
如果工人尚未运行,则需要30秒的时间来启动工人。在Windows上,如果您在运行parpool
时观察Task Manager,您将看到在工人启动时,在这30秒内会弹出更多的MATLAB副本(他们实际上不是MATLAB本身,他们是MATLAB工作者——你可以区分他们,因为他们在没有桌面的情况下使用更少的内存)
要比较MATLAB对OpenMP的操作,请注意,这些MATLAB工作程序是独立的进程,而OpenMP在现有进程中创建多个线程