罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经退休,不会被更新。

运行脚本在并行计算集群使用批处理命令工具

我想介绍一下本周的客座博客Edric埃利斯。Edric适合并行计算开发团队在MathWorks。在这篇文章中他将讨论使用批处理命令并行计算工具。

有时候,即使你优化你的MATLAB®代码,你会发现你有这么多的模拟运行,或场景来探索你的桌面计算机上运行他们花费的时间太长了。并行计算工具箱™在一起MATLAB分布式计算服务器™可以帮助您在计算机集群上运行脚本和函数。以及运行在一个远程集群并行计算工具箱允许您使用您的桌面机中的核心作为一个简单的本地集群。本文将展示如何使用这个地方集群,但是一旦你有东西在“本地”集群,它是简单的扩大远程集群上运行脚本。

这个问题我们要看的是蒙特卡罗模拟的金融工具——预期收益在手中21点在一个赌场。我们将在三个阶段:问题的方法

  • 运行21点在MATLAB仿真
  • 提交批处理作业21点在“本地”集群上运行
  • 添加parfor循环的脚本
  • 内容

    运行21点在MATLAB仿真

    计算的结果玩21点是由单手克里夫硅藻土,是可用的文件交换。在这篇文章中,我们将使用一个轻微的修改版本的程序,我们提取的计算单手玩21点,这样我们可以以各种不同的方式调用它。有一个算法在第9章的讨论克里夫的书“与MATLAB数值计算”

    克里夫描述的数量就单手玩21点如下:

    “(赢得)零“推”,赢得21点15美元,赢或输10美元的手没有被分割或翻倍,赢或输20美元的手已经分裂或翻了一倍,并赢得或失去30或40美元的手已经分裂后翻了一倍。30和40美元的回报很少发生(和可能不被允许在一些赌场)。”

    我们可以计算奖金的几个人玩21点只需调用blackjack_kernel几次。

    奖金= 0 (10);2 = 1:10奖金(ii) = blackjack_kernel;结束奖金
    -10年奖金= 15 0 0 -10 -10 -10 -10 10

    直接在MATLAB运行21点作为一个脚本

    这个脚本blackjack_script模拟一个玩21点的许多手的玩家数量,并计算每个玩家手后他们的净利润。让我们运行这个脚本,然后绘制结果柱状图显示分布的损益的球员之一。

    类型blackjack_scriptblackjack_script;嘘(结果);标题(“损益玩21点”);包含(“利润”);ylabel (“数”);
    numHands = 500;numPlayers = 50;结果= 0 (1、numPlayers);抽搐h = 1: numHands thisHand = 0 (1, numPlayers);p = 1: numPlayers thisHand (p) = blackjack_kernel;最终结果= + thisHand结果;t = toc结束;流('时间模拟% d % d玩家玩21点的手:%。3 g秒\ n’,……numPlayers numHands t);时间模拟500玩家玩21点的手:8.04秒

    提交批处理作业21点在“本地”集群上运行

    现在我们的脚本工作正常,我们可以提交脚本执行集群上。在本例中,我们将使用“本地”集群,因为它总是可用,但你可能会提交脚本执行远程集群上如果你有一个可用的。当你提交到远程集群,你可以关闭你的MATLAB会话和收集后的结果。如果您正在使用本地集群中,您可以使用MATLAB会话而进行批处理作业在后台运行;同样,你可以有几个同时运行批处理作业。

    我们调用批处理命令我们希望运行的脚本的名称,在这里我们也指定它“配置文件”我们希望使用。概要文件识别不同集群联系你了,可能是可用的,本地的配置文件总是可用的。其他集群类型需要一个mdc安装。如果你只有一个概要文件,您不需要指定配置参数。返回的批处理命令是一个工作对象。工作对象允许我们的进步跟踪执行在集群上,当它完成,我们可以访问结果。

    以及使用批处理命令直接从MATLAB命令行,您可以右键单击一个脚本文件浏览器在MATLAB的当前文件夹,并选择“运行脚本批处理工作”。它使用默认集群配置文件。

    在这个例子中,工作,我们做的第一件事是调用等待这样我们才继续执行完成的工作。或者,您可以继续工作在MATLAB和检查工作通过观察的状态job.State,加载状态时的结果“完成”

    工作=批(“blackjack_script”,“配置文件”,“本地”);%等待工作完成执行。等待(工作);%的结果执行工作加载到MATLAB工作区负载(工作);%,显示日志的输出工作disp (日记的批处理作业的输出:)日记(工作);%我们像之前那样,我们可以画出结果。嘘(结果);标题(“损益玩21点”);包含(“利润”);ylabel (“数”);
    日记批处理作业的输出:时间模拟500玩家玩21点的手:7.93秒

    向脚本添加parfor循环

    在本地机器上运行一个批处理作业不让事情再快,虽然远程集群上运行的工作可能会让你进入一个更强大的机器。甚至在本地机器上,我们仍然可以使用parfor以获得加速。外的每个迭代循环blackjack_script是独立的,和计算结果是“减少”或总结操作parfor能理解。我们可以重新使用脚本变成一个变体parfor仅仅通过改变外循环:

    类型blackjack_script_parfor
    numHands = 500;numPlayers = 50;结果= 0 (1、numPlayers);抽搐parfor h = 1: numHands thisHand = 0 (1, numPlayers);p = 1: numPlayers thisHand (p) = blackjack_kernel;最终结果= + thisHand结果;t = toc结束;流('时间模拟% d % d玩家玩21点的手:%。3 g秒\ n’,……numPlayers numHands t);

    以开放的MATLAB运行parfor脚本池

    我们可以检查parfor开一个交互式回路是否正常工作matlabpool会话。一个互动matlabpool会话启动工人根据您所指定的配置文件,并使它们可用MATLAB会话运行的身体parfor循环。通常情况下,这是一个好主意离开matlabpool保持打开状态,但我们要关闭它运行脚本后释放的工人,这样我们可以运行一个批处理作业。

    %开放matlabpool使用本地的配置文件matlabpool开放当地的%运行脚本blackjack_script_parfor%关闭池再次释放工人当我们运行批处理作业matlabpool关闭
    matlabpool开始使用“本地”概要文件…连接到6个实验室。时间模拟500玩家玩21点的手:1.87秒发出停止信号的所有实验室……停止了。

    包含一个parfor循环运行一个批处理作业

    运行一个批处理作业parfor循环使用,我们需要指定一个额外的参数批处理命令- - - - - -“Matlabpool”。选项指定的价值有多少额外的工人在运行脚本时使用。机器我使用6芯,所以我可以跑1工人控制脚本执行,和5作为额外的工人matlabpool。这些额外的工人操作的主体parfor更快地循环并行计算结果。

    工作=批(“blackjack_script_parfor”,包含parfor %运行脚本“配置文件”,“本地”,%使用当地的概要文件“Matlabpool”5);%的Matlabpool大小5%等待工作完成执行。等待(工作);%的结果执行工作加载到MATLAB工作区负载(工作);%,显示日志的输出工作disp (的批处理作业的输出使用parfor日记:“)日记(工作);%我们像之前那样,我们可以画出结果。嘘(结果);标题(“损益玩21点”);包含(“利润”);ylabel (“数”);
    日记批处理作业的输出使用parfor: 50次模拟玩家玩500的21点:1.92秒

    结论

    我们已经看到如何使用批处理命令,我们可以发送一个集群上执行脚本。我们使用“本地”集群在这里,这是一个并行计算工具箱的一部分,但我们可以简单地使用远程分布式计算集群如果MATLAB服务器安装。使用远程集群允许更多的计算资源被使用在工作的执行。一些每次迭代循环(可以独立于其他人)执行并行执行使用parfor,我们看到了如何运行批处理我们的脚本包含一个工作parfor循环。

    有更多的细节让你的代码运行在集群中文档。你还有其他关于在集群上运行您的代码的问题吗?让我们知道在这里




    使用MATLAB®7.14发表

    |
    • 打印
    • 发送电子邮件