主要内容

从桌面缩放到群集

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

开发您的算法

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

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

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

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

tic;为了= 1:numel(idx,:) = factor(idx,:));结尾TOC.
运行时间为684.464556秒。

在本地并行池上运行代码

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

tic;parfor= 1:numel(idx,:) = factor(idx,:));结尾TOC.
运行时间为144.550358秒。

当你使用时parfor并且您有并行计算工具箱,MATLAB会自动启动一个并行工人池。并行池需要一些时间才能开始。此示例显示了已启动池的第二个运行。

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

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

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

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

为了w = 1:numel(numWorkers) tic;parfor(idx = 1:numel(compositeNumbers), numWorkers(w))) factors(idx,:) = factor(compositeNumbers(idx));结尾Tlocal(w)= toc;结尾

通过计算单个工作人员的计算时间与每个最大数量的计算时间之间的比率来计算加速。为了可视化计算如何与工人的数量缩放,绘制加速对工人的数量。观察到加速随工作人员的数量。但是,由于与并行化相关的开销,缩放并不完美。

f =图;speedup = 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 =零(大小(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并稍后检索结果。

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

注意,如果您使用,MATLAB将所有工作区变量传输到群集中,即使您的脚本不使用它们。如果您有一个大工作区,它会影响数据传输时间。作为最佳实践,将脚本转换为函数文件以避免此通信开销。您可以通过简单地在脚本的开头添加函数行来执行此操作。学习如何转换myparallellgorithm.到一个函数,看myparalleltalgorithmfcn.

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

totalNumberOfWorkers = 65;集群= parcluster (“MyCluster”);作业=批处理(群集,'myparallellgorithmfcn'2,“池”,TotalNumberofWorkers-1,'currentfolder'“。”);

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

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

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

等待(工作);

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

输出= fetchOutputs(作业);numworkers =输出{1};time =输出{2};

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

图Speedup = time(1,:) ./时间;情节(NumWorkers,Speedup);传奇(“问题复杂性1”《问题复杂性2》'问题复杂性3''问题复杂性4''地点''西北');标题(“加速和复杂性”);包含(工人的数量);XTICKS(NUMWORKERS(2:结束));ylabel ('加速');

另请参阅

|||

相关的例子

更多关于