主要内容

从桌面扩展到集群

这个例子展示了如何在本地机器上开发并行MATLAB®代码,并扩展到集群。集群提供更多的计算资源来加速和分发计算。您可以在本地机器上以交互方式并行运行代码,然后在集群上运行,而无需更改代码。当您在本地机器上完成代码原型时,您可以使用批处理作业将计算转移到集群。因此,您可以关闭MATLAB并在稍后检索结果。

开发你的算法

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

创建一个64位精度的素数向量,并将素数对随机相乘以获得较大的合数。创建一个数组来存储每次分解的结果。本例中以下各部分中的代码可能需要20分钟以上的时间2 ^ 19.运行2 ^ 21看看最优的最终情节。

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

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

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

在本地并行池上运行代码

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

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

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

默认的集群配置文件为“本地”.您可以检查这个配置文件是否在MATLAB中被设置为默认值首页选项卡,在平行>选择默认集群.启用这个配置文件后,MATLAB在您的机器上为并行池创建工人。当你使用“本地”默认情况下,MATLAB在您的机器中启动与物理核心一样多的worker,直到您所喜欢的worker数量。您可以使用并行首选项控制并行行为。在MATLAB首页选项卡上,选择平行>平行的偏好

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

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

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

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

通过计算单个worker的计算时间与每个最大worker数量的计算时间之间的比率来计算加速。为了直观地看到计算如何随着工人数量的增加而增加,绘制出与工人数量的加速关系图。注意,这种加速是随着工人数量的增加而增加的。然而,由于与并行化相关的开销,这种扩展并不完美。

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

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

删除(gcp);

设置集群

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

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

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

在集群并行池上运行代码

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

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

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

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

numWorkers = [1 2 4 6 16 32 64];tCluster = 0(大小(numWorkers));w = 1:numel(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根据本例中显示的整数分解问题执行一个简单的基准测试。该脚本通过不同数量的worker来度量多个问题复杂性的计算时间。

注意,如果您使用批处理, 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};

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

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

另请参阅

|||

相关的例子

更多关于