主要内容

从桌面缩放到群集

此示例显示如何在本地计算机上开发并行MATLAB®Code并缩放到群集。群集提供更多的计算资源以加快和分发您的计算。您可以在本地计算机上并行运行代码,然后在群集中进行交互方式,而无需更改代码。完成当本地计算机上的代码进行原型时,可以使用批处理作业将计算卸载到群集中。因此,您可以关闭MATLAB并稍后检索结果。

开发你的算法

首先在本地计算机上进行原型设计算法。该示例使用整数分解为样本问题。它是一个计算密集型问题,其中分解的复杂性随着数字的大小而增加。您使用简单的算法来构建一个整数的序列。

在64位精度中创建素数的向量,并随机乘以素数对以获得大的复合数字。创建一个数组来存储每个分解的结果。在此示例中每个部分中的每个部分中的代码可能需要超过20分钟。要更快,请使用更少的素数减少工作负载,例如2 ^ 19.。运行2 ^ 21.看到最佳的最终情节。

primenumbers = primes(Uint64(2 ^ 21));CompositEnumbers = PrimeNumbers。* PrimeNumbers(Randperm(Numel(PrimeNumbers)));因子=零(NumEr(PrimeNumbers),2);

使用循环来考虑每个复合数字,并测量计算所需的时间。

抽搐;IDX = 1:NUMER(CompositeNumbers)因子(IDX,:)=因子(CompositeNumbers(IDX));结束toc
经过时间为684.464556秒。

在本地并行池上运行代码

并行计算工具箱™使您可以通过在并行池中的多个工人上运行来扩展工作流程。前一个的迭代循环是独立的,所以你可以使用议案循环分配给多个工人的迭代。简单地改变你的循环到一个议案环形。然后,运行代码并测量整体计算时间。代码在并行池中运行,没有进一步更改,而工人将计算发送回本地工作区。由于工作负载分布在若干工人上,所以计算时间较低。

抽搐;议案IDX = 1:NUMER(CompositeNumbers)因子(IDX,:)=因子(CompositeNumbers(IDX));结束toc
经过时间为144.550358秒。

当你使用议案你有了并行计算工具箱,MATLAB自动启动一个并行的工人池。并行池需要一些时间来启动。这个例子显示了池已经启动的第二次运行。

默认的群集配置文件是“本地”。您可以检查该配置文件是否在MATLAB中设置为默认值首页标签,in.平行>选择默认群集。启用此配置文件,MATLAB为并行池创建计算机上的工作人员。当你使用的时候“本地”默认情况下,MATLAB默认启动您的机器中的物理核心,最多可达您的首选工作人员。您可以使用并行首选项控制并行行为。在MATLAB首页选项卡上,选择平行>并行偏好

要用工人的数量来衡量加速,请多次运行相同的代码,限制工人的最大数量。首先,定义每次运行的工人数量,直到池中的工人数量,并创建一个数组来存储每个测试的结果。

numworkers = [1 2 4 6];Tlocal =零(尺寸(numworkers));

使用循环遍历最大数量的工人,并运行以前的代码。要限制工人的数量,请使用第二个输入参数议案

w = 1:numel(numworkers)tic;议案(IDX = 1:NUMER(CompositEnumbers),NumWorkers(W))因子(IDX,:) =因子(CompositEnumbers(IDX));结束Tlocal(w)= toc;结束

通过计算单个工作人员的计算时间与每个最大工作人员的计算时间之间的比率来计算加速。为了直观地显示计算是如何随着工作人员的数量而增加的,可以将加速值与工作人员的数量绘制成图。注意,速度随着工人数量的增加而增加。然而,由于并行化带来的开销,这种伸缩性并不完美。

f =数字;speedup = tlocal(1)./ tlocal;情节(NumWorkers,Speedup);标题(“加快工人数量”);Xlabel(“工人数量”);xticks(numworkers);ylabel('加速');

使用计算完成后,删除当前并行池,以便为群集创建一个新的。您可以使用当前并行池获取gcp函数。

删除(gcp);

设置群集

如果您的计算任务对于本地计算机来说太大或太慢,您可以将计算卸载到现场的集群或云中。在运行接下来的部分之前,您必须访问一个集群。在MATLAB首页标签,去平行>发现群集要查明您是否已访问Matlab Parturant Server™是否已访问群集。有关更多信息,请参阅发现群集

如果您无权访问群集,则必须在运行下一节之前配置对其的访问权限。在MATLAB中,您可以直接从MATLAB桌面创建云服务中的群集,例如Amazon AWS。在这一点首页标签,在平行菜单中,选择创建和管理集群。在集群配置文件管理器中,单击创建云集群。了解更多有关缩放到云的信息,请参阅云中心入门。要了解有关缩放到网络中群集的选项的更多信息,请参阅开始MATLAB并行服务器(MATLAB并行服务器)

设置群集配置文件后,您可以修改其属性平行>创建和管理集群。有关更多信息,请参阅发现群集并使用群集配置文件。以下图像显示了群集配置文件集群简介管理器

在群集并行池上运行代码

如果要默认情况下要在集群中运行并行函数,请将群集配置文件设置为默认值平行>选择默认群集

您还可以使用编程方法来指定您的集群。控件中指定集群配置文件的名称,从而在集群中启动并行池parpool.命令。在以下代码中,更换mycluster.使用群集配置文件的名称。还指定具有第二个输入参数的工人数。

parpool ('mycluster',64);
使用“MyCluster”配置文件启动并行池(Parpool)...连接到64名工人。

如前所述,通过多次运行相同的代码来测量与工人数量的加速度,并限制最大工人数。因为此示例中的群集允许更多工人而不是本地设置,numworkers.可以保存更多的值。如果运行此代码,则议案循环现在在群集中运行。

numworkers = [1 2 4 6 16 32 64];tcluster =零(大小(numworkers));w = 1:numel(numworkers)tic;议案(IDX = 1:NUMER(CompositEnumbers),NumWorkers(W))因子(IDX,:) =因子(CompositEnumbers(IDX));结束tcluster(w)= toc;结束

计算加速值,并将其与工作人员的数量画在一起,以便可视化计算是如何随着工作人员的数量而增加的。与本地设置的结果进行比较。注意,速度随着工人数量的增加而增加。然而,由于并行化带来的开销,这种伸缩性并不完美。

图(f);抓住speedup = tcluster(1)./ tcluster;情节(NumWorkers,Speedup);标题(“加快工人数量”);Xlabel(“工人数量”);xticks (numWorkers(2:结束));ylabel('加速');

使用计算完成后,删除当前并行池。

删除(gcp);

卸载并使用计算计算批处理

在完成原型设计和交互式运行之后,您可以使用批处理作业在后台卸载长时间运行的计算。计算在集群中进行,稍后可以关闭MATLAB并检索结果。

使用批处理将批处理作业提交给群集。您可以将算法的内容放在脚本中,并使用批处理提交它的功能。例如,脚本myParallelAlgorithm基于此示例中显示的整数分解问题执行简单的基准。脚本测量具有不同数量的工人的多个问题复杂性的计算时间。

请注意,如果您使用脚本文件批处理, MATLAB将所有的工作区变量转移到集群中,即使您的脚本不使用它们。如果您有一个大的工作空间,它会对数据传输时间产生负面影响。作为一种最佳实践,将脚本转换为函数文件,以避免这种通信开销。只需在脚本的开头添加一个函数行就可以做到这一点。学习如何转换myParallelAlgorithm函数,参见myParallelAlgorithmFcn

以下代码提交myParallelAlgorithmFcn作为批处理作业。myParallelAlgorithmFcn返回两个输出参数,numworkers.时间,必须指定2作为输出数的输入参数。因为代码需要一个并行池议案循环,使用'水池'名称值对批处理指定工人的数量。群集使用额外的工作者运行函数本身。默认,批处理将群集中工人的当前文件夹更改为MATLAB客户端的当前文件夹。控制当前文件夹很有用。例如,如果您的群集使用不同的文件系统,因此路径不同,例如从Windows客户端计算机提交到Linux群集时。设置名称值对“CurrentFolder”到您选择的文件夹或'。'避免更改工人的文件夹。

TotalNumberofworkers = 65;cluster = parcluster('mycluster');工作=批(集群,“myParallelAlgorithmFcn”2,'水池'totalNumberOfWorkers-1,“CurrentFolder”'。');

要在提交后监控工作状态,请打开作业监视器平行>监控工作。计算在群集中从群集中开始时,作业的状态更改为跑步

您可以在提交作业后关闭MATLAB。当您再次打开MATLAB时,作业监视器为您跟踪作业,如果您右键单击它,您可以与它交互。例如,要检索作业对象,请选择显示详细资料,并将批作业的输出传输到工作区中,请选择获取输出

或者,如果您想阻塞MATLAB直到作业完成,请使用等待函数在作业对象上的。

等待(工作);

要从群集中传输函数的输出,请使用fetchOutputs函数。

输出= fetchOutputs(工作);numWorkers ={1}输出;时间=输出{2};

检索结果后,您可以使用它们在本地计算机上计算。计算加速度,并将其统治抵御工人的数量。因为代码运行了不同问题复杂性的因子化,所以您可以为每个级别进行绘图。您可以看到,对于每个问题复杂性,加速随着工人的数量而增加,直到额外工人的开销大于来自并行化的性能增益。当您提高问题复杂性时,您可以在大量工作人员获得更好的加速,因为与并行化相关的开销不太重要。

Figure speedup = time(1,:)./time;情节(numWorkers加速);传奇('问题复杂性1''问题复杂性2''问题复杂性3''问题复杂性4''地点'“西北”);标题('加速VS复杂性');Xlabel(“工人数量”);xticks (numWorkers(2:结束));ylabel('加速');

也可以看看

|||

相关例子

更多关于