【问题标题】:What is happening when Matlab is starting a "parallel pool"?当 Matlab 启动“并行池”时会发生什么?
【发布时间】:2017-08-18 17:21:44
【问题描述】:

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

parpool()

根据documentation,那个函数:

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

这个函数通常需要一些时间来执行,大约 30 秒。但在 OpenMP 等其他多 CPU 范例中,并行执行似乎完全透明——我从未注意到任何类似于 Matlab 所做的行为(当然我对并行编程不是很有经验)。

那么,在调用parpool() 和完成执行之间实际发生了什么?什么需要这么长时间?

【问题讨论】:

    标签: matlab parallel-processing


    【解决方案1】:

    Parallel Computing Toolbox 使您能够使用几种不同的范例(例如作业和任务、parforspmdparfeval、批处理)并行运行 MATLAB 代码,也可以在本地运行(跨内核并行运行)在您的本地机器中)或远程(在集群中的机器之间并行 - 您拥有的一台或云中的一台)。

    在任何这些情况下,代码都在 MATLABworkers 上运行,它们基本上是没有交互式桌面的 MATLAB 副本。

    如果您打算在远程集群上运行,这些工作器很可能已经启动并准备好运行代码。如果您打算在本地运行,您可能已经启动了 worker,但可能还没有。

    上面的一些结构(例如作业和任务、批处理)只是运行您要求的事情,然后工作人员返回可用于其他事情(可能来自不同的用户)。

    但某些构造(例如parforspmd)要求您打算运行的工作人员为您保留一段时间 - 部分原因是它们可能存在空闲一段时间,您不希望它们被另一个用户接管,部分原因是(与作业和任务或批处理不同)它们可能需要相互通信。这称为创建工作池

    当您运行 parpool 时,您是在告诉 MATLAB 您想为自己保留一个工作程序池,因为您打算运行一个需要工作程序池的构造。您可以将集群配置文件指定为输入参数,这将告诉它您是要在远程集群上运行还是在本地运行。

    如果您在集群上运行,parpool 将向集群发送一条消息,以保留其中的一些(已经运行的)工作线程供您使用。

    如果您在本地运行,parpool 将确保有足够的工作人员在本地运行,然后为您将它们连接到池中。

    需要 30 秒的时间是需要启动工作程序的部分,如果它们还没有运行的话。在 Windows 上,如果您在运行 parpool 时观看任务管理器,您会看到 MATLAB 的其他副本在工作人员启动的那 30 秒内弹出(它们实际上不是 MATLAB 本身,它们是 MATLAB 工作人员 - 您可以区分因为他们将在没有桌面的情况下使用更少的内存)。

    要比较 MATLAB 与 OpenMP 所做的事情,请注意这些 MATLAB 工作进程是独立的进程,而 OpenMP 在现有进程中创建多个线程。

    【讨论】:

      【解决方案2】:

      老实说,我认为我们永远不会确切地知道 MatLab 是做什么的。

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

      注意事项:

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

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

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

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

      【讨论】:

        【解决方案3】:

        跟进@Nicky 的回答的更多细节。创建并行池涉及:

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

        parpool 和 OpenMP 之类的开销差异在于,parpool 通常会启动额外的 MATLAB 进程 - 一个相对重量级的操作,而 OpenMP 只是在单个进程中创建额外的线程 - 相对轻量级。此外,正如@Nicky 指出的那样 - MATLAB 本质上可以对一些/大多数矢量化操作进行多线程处理 - parpool 对于不会发生这种情况或者您有一个真正的多节点集群可供运行的情况很有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-09
          • 2012-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 1970-01-01
          • 2012-12-05
          相关资源
          最近更新 更多