主要内容

从桌面扩展到集群

在本地机器上开发并行MATLAB®代码,并扩展到集群。

集群提供了更多的计算资源来加速和分布您的计算。您可以在本地机器上并行交互式地运行代码,然后在集群上运行,而无需更改代码。当您在本地机器上完成代码的原型构建后,您可以使用批处理作业将计算工作卸载到集群。因此,您可以关闭MATLAB并稍后检索结果。

开发你的算法

首先在本地机器上创建算法原型。该示例使用整数分解作为示例问题。这是一个计算密集的问题,因式分解的复杂性随着数字的大小而增加。您使用一个简单的算法来分解一个整数序列。

创建一个64位精度的素数向量,并将素数对随机相乘,以获得较大的合数。创建一个数组来存储每次分解的结果。本例中以下每个部分中的代码可能需要花费20分钟以上的时间。为了使其更快,可以通过使用更少的素数来减少工作负载,例如2 ^ 19.运行2 ^ 21看看最佳的最终地块。

primeNumbers =质数(uint64 (2 ^ 21));compositeNumbers = primeNumbers。* primeNumbers (randperm(元素个数(primeNumbers)));因素= 0(元素个数(primeNumbers), 2);

使用循环分解每个合数,并测量计算所需的时间。

抽搐;idx = 1:numel(compositeNumbers) factors(idx,:) = factor(compositeNumbers(idx));结束toc
运行时间为684.464556秒。

在本地并行池上运行代码

并行计算工具箱™使您能够通过在并行池中的多个工作者上运行来扩展您的工作流。前面的迭代循环是独立的,所以你可以用aparfor循环将迭代分配给多个工作人员。仅仅是改变你的循环到一个parfor循环。然后,运行代码并测量总体计算时间。代码在一个并行池中运行,没有进一步的更改,工作人员将您的计算发送回本地工作区。由于工作负载分布在多个工作者之间,因此计算时间较短。

抽搐;parforidx = 1:numel(compositeNumbers) factors(idx,:) = factor(compositeNumbers(idx));结束toc
运行时间为144.550358秒。

当你使用parfor你有一个并行计算工具箱,MATLAB会自动启动一个并行工作池。并行池启动需要一些时间。此示例显示了池已经启动的第二次运行。

默认配置文件为“过程”.您可以在MATLAB上检查该配置文件是否设置为默认值首页选项卡,在平行>选择并行环境.启用这个配置文件后,MATLAB在您的机器上为并行池创建工作者。当您使用“过程”profile, MATLAB,在默认情况下,启动与您的机器中的物理核一样多的工作线程,直到您首选的工作线程数量。您可以使用并行首选项来控制并行行为。在MATLAB首页选项卡上,选择平行>平行的偏好

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

numWorkers = [1 2 4 6];tLocal = 0(大小(numWorkers));

使用一个循环来遍历工人的最大数量,并运行前面的代码。要限制工人的数量,使用第二个输入参数ofparfor

w = 1: numl (numWorkers) tic;parfor(idx = 1:numel(compositeNumbers), numWorkers(w)) factors(idx,:) = factor(compositeNumbers(idx));结束tLocal (w) = toc;结束

通过计算单个工位的计算时间与每个最大工位的计算时间之比来计算加速。为了可视化计算如何随着工人数量的增加而增加,可以根据工人数量绘制加速图。可以观察到,随着工作人员数量的增加,加速速度也在增加。然而,由于与并行化相关的开销,这种伸缩并不完美。

f =图;加速= tLocal(1)。/ tLocal;情节(numWorkers加速);标题(“随着工人数量的增加而加速”);包含(工人的数量);xticks (numWorkers);ylabel (“加速”);

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

删除(gcp);

设置集群

如果您的计算任务对本地计算机来说太大或太慢,您可以将计算卸载到现场的集群或云中。在运行下一节之前,必须访问集群。在MATLAB首页选项卡,去平行>发现集群查看您是否已经使用MATLAB并行服务器™访问了集群。有关更多信息,请参见发现集群

如果您没有访问集群的权限,那么您必须配置对集群的访问权限,然后才能运行下一节。在MATLAB中,您可以直接从MATLAB Desktop在云服务中创建集群,例如Amazon AWS。在首页选项卡,平行菜单中,选择创建和管理集群.在“集群配置文件管理器”中,单击创建云计算集群.要了解更多关于向云扩展的信息,请参见云中心入门.要了解更多有关在网络中扩展到集群的选项的信息,请参见开始使用MATLAB并行服务器(MATLAB并行服务器)

设置集群配置文件后,可以在平行>创建和管理集群.有关更多信息,请参见发现集群并使用集群概要文件.中的群集概要文件集群配置文件管理器

在集群并行池上运行代码

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

您还可以使用编程方法指定您的集群。方法中指定集群配置文件的名称,在集群中启动一个并行池parpool命令。在以下代码中,替换MyCluster使用您的集群概要文件的名称。还要用第二个输入参数指定工作人员的数量。

parpool (“MyCluster”, 64);
使用“MyCluster”配置文件启动并行池(parpool)…与64名工人相连。

与前面一样,通过运行相同的代码几次,并限制最大的工作人员数量,来衡量加速。因为本例中的集群比本地设置允许更多的工作人员,numWorkers可以容纳更多的值。如果运行此代码,则parfor循环现在在集群中运行。

numWorkers = [1 2 4 6 16 32 64];tCluster = 0(大小(numWorkers));w = 1: numl (numWorkers) tic;parfor(idx = 1:numel(compositeNumbers), numWorkers(w)) factors(idx,:) = factor(compositeNumbers(idx));结束tCluster (w) = toc;结束

计算加速,并将其与工作人员的数量绘制图,以可视化计算如何随着工作人员的数量而扩大。将结果与本地设置进行比较。可以观察到,随着工作人员数量的增加,加速速度也在增加。然而,由于与并行化相关的开销,这种伸缩并不完美。

图(f);持有加速= tCluster(1)。/ tCluster;情节(numWorkers加速);标题(“随着工人数量的增加而加速”);包含(工人的数量);xticks (numWorkers(2:结束));ylabel (“加速”);

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

删除(gcp);

卸载和扩展您的计算批处理

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

使用批处理函数向集群提交批处理作业。可以将算法的内容放在脚本中,并使用批处理函数提交它。例如,脚本myParallelAlgorithm基于本例中显示的整数分解问题执行一个简单的基准测试。该脚本测量了不同工作者数量的几个复杂问题的计算时间。

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

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

totalNumberOfWorkers = 65;集群= parcluster (“MyCluster”);工作=批(集群,“myParallelAlgorithmFcn”2,“池”totalNumberOfWorkers-1,“CurrentFolder”“。”);

中打开作业监视器以监视作业提交后的状态平行>监控工作.当集群中开始计算时,作业的状态变为运行

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

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

等待(工作);

要从群集转移函数的输出,请使用fetchOutputs函数。

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

在检索结果之后,您可以在本地机器上使用它们进行计算。计算加速,并将其与工人的数量绘制图。因为代码针对不同的问题复杂性运行因式分解,所以每一层都有一个图。您可以看到,对于每个复杂的问题,加速会随着工作人员数量的增加而增加,直到额外工作人员的开销大于并行化带来的性能收益。当您增加问题的复杂性时,您可以在大量的工作人员上实现更好的加速,因为与并行化相关的开销不那么显著。

图speedup = time(1,:)./time;情节(numWorkers加速);传奇(“问题复杂性1”《问题复杂性2》的问题复杂性3 '“问题复杂性4”“位置”“西北”);标题(“加速和复杂性”);包含(工人的数量);xticks (numWorkers(2:结束));ylabel (“加速”);

另请参阅

|||

相关的例子

更多关于

Baidu
map