Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Matlab启动一个";并行池;?_Matlab_Parallel Processing - Fatal编程技术网

当Matlab启动一个";并行池;?

当Matlab启动一个";并行池;?,matlab,parallel-processing,Matlab,Parallel Processing,在Matlab中运行并行CPU进程从以下命令开始 parpool() 根据报告,该职能: [创建]工人池上的特殊作业,并[连接]MATLAB客户端到并行池 此函数通常需要一点时间来执行,大约30秒。但在其他多CPU模式(如OpenMP)中,并行执行似乎完全透明——我从未注意到任何类似于Matlab的行为(尽管我对并行编程不是很有经验) 那么,在调用parpool()和它完成执行之间实际发生了什么?怎么这么久 老实说,我认为我们永远不会确切知道MatLab的功能 然而,为了给你一些答案,MatL

在Matlab中运行并行CPU进程从以下命令开始

parpool()
根据报告,该职能:

[创建]工人池上的特殊作业,并[连接]MATLAB客户端到并行池

此函数通常需要一点时间来执行,大约30秒。但在其他多CPU模式(如OpenMP)中,并行执行似乎完全透明——我从未注意到任何类似于Matlab的行为(尽管我对并行编程不是很有经验)


那么,在调用
parpool()
和它完成执行之间实际发生了什么?怎么这么久

老实说,我认为我们永远不会确切知道MatLab的功能

然而,为了给你一些答案,MatLab基本上打开了它自己的其他实例,让它在上面执行代码。为了做到这一点,它首先需要检查应该在哪里打开实例(您可以将集群从本地更改为您可以访问的任何其他集群,例如Amazons EC2集群)。一旦新实例被打开,MatLab就会设置从主窗口到实例的连接

注:

1) 不建议在函数或脚本中使用
parpool
,因为如果在并行池打开时运行,则会引发错误。使用并行命令,例如
parfor
将自动打开实例

2)
parpool
只需执行“一次”(在关闭前),即如果再次运行代码,实例已经打开

3) 如果希望避免代码中的开销,可以在MATLAB的搜索路径中创建一个名为startup.m的文件,使用命令
parpool
,这将在启动时自动启动并行池


4) 矢量化代码将自动使其并行化,而不会产生额外的开销。

关于@Nicky的回答,我们将进一步介绍一些细节。创建并行池包括:

  • 将通信作业提交到适当的群集
  • 这将招募MATLAB工作进程。这些进程可能已经在运行(在MJ的情况下),或者可能需要启动(在
    'local'
    和所有其他集群类型的情况下)
  • 在工作人员之间设置MPI通信以支持
    spmd
    (除非在启动池时指定“
    'SpmdEnabled',false
    ”——但是,此阶段通常不是性能瓶颈)
  • MATLAB工作人员随后连接到客户机,以便他们可以进行投标

  • 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在现有进程中创建多个线程