当Matlab启动“并行池”时会发生什么?

时间:2017-08-18 02:19:46

标签: matlab parallel-processing

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

开始
parpool()

根据documentation,该功能:

  

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

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

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

3 个答案:

答案 0 :(得分:2)

说实话,我认为我们不会完全了解MatLab的作用。

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

注意:

1)不建议在函数或脚本中使用func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { if searchIsOn { return filteredTeamNames.count } else{ return teamNames.count } } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifierTwo, for: indexPath as IndexPath) as! HouseCells cell.layer.masksToBounds = true cell.layer.cornerRadius = 6 var singleComponent = [String : String]() if searchIsOn { singleComponent = self.filteredTeamNames[indexPath.item] } else { singleComponent = self.teamNames[indexPath.item] } let stringURL: String = singleComponent["icon_profile"]! cell.teamImage.sd_setImage(with: URL(string: stringURL), placeholderImage: UIImage(named: "demo")) cell.teamNameLabel.text = singleComponent["username"] //to check for bg color let idValue: Int = Int(singleComponent["id"]!)! print(idValue) if selectedTeamIDs.contains(idValue) { cell.backgroundColor = UIColor(red:0/255, green:0/255, blue:0/255, alpha:1.0) cell.layer.borderWidth = 2.0 cell.layer.borderColor = UIColor(red:56/255, green:192/255, blue:201/255, alpha:1.0).cgColor } else { cell.backgroundColor = UIColor(red:26/255, green:26/255, blue:26/255, alpha:0.4) } return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { var singleComponent = [String : String]() if searchIsOn { singleComponent = self.filteredTeamNames[indexPath.item] } else { singleComponent = self.teamNames[indexPath.item] } let idTempValue: Int = Int(singleComponent["id"]!)! print(idTempValue) if !selectedTeamIDs.contains(idTempValue) { selectedTeamIDs.append(idTempValue) } print(selectedTeamIDs) middleSectionCollView.reloadData() } ,就好像在并行池打开时运行它会导致错误。使用并行命令,例如parpool会自动打开该实例。

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

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

4)对代码进行矢量化将自动使其并行化而不会产生开销。

答案 1 :(得分:2)

Parallel Computing Toolbox允许您使用几种不同的范例(例如,作业和任务,parforspmdparfeval,批处理)并行运行MATLAB代码,并运行它本地(在本地计算机的核心之间并行化)或远程(在群集中的计算机之间并行化 - 您拥有的一个或云中的一个)。

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

如果您打算在远程群集上运行,那么这些工作人员可能已经启动并准备好运行代码。如果您打算在本地开展业务,那么您可能已经有了工作人员,但也许您还没有。

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

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

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

如果您正在群集上运行,parpool会向群集发送一条消息,以保留一些(已在运行的)工作人员供您使用。

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

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

要比较MATLAB对OpenMP的作用,请注意这些MATLAB工作程序是单独的进程,而OpenMP在现有进程中创建多个线程。

答案 2 :(得分:0)

关于@Nicky回答的一些进一步细节。创建并行池包括:

  1. 将通信作业提交到适当的群集
  2. 这招募了MATLAB工作流程。这些进程可能已在运行(在MJS的情况下),或者可能需要启动它们(在'local'的情况下,以及所有其他集群类型)。
  3. 在工作人员中设置MPI通信以支持spmd(除非您在启动池时指定“'SpmdEnabled', false” - 但是,此阶段通常不是性能瓶颈。)
  4. 然后将MATLAB工作人员连接到客户端,以便他们可以进行竞标。
  5. parpool和OpenMP之类的开销之间的差异是因为parpool通常会启动额外的MATLAB流程 - 相对较重的操作,而OpenMP只是在单个流程中创建额外的线程 - 相对较轻-重量。另外,正如@Nicky指出的那样 - MATLAB本质上可以多线程一些/大多数矢量化操作 - parpool对于没有发生这种情况的情况很有用,或者你可以运行真正的多节点集群。