使用parfor
加快蒙特卡罗代码
这个例子展示了如何加快蒙特卡罗代码通过使用parfor
循环。蒙特卡罗方法在许多领域,包括物理、数学、生物学、和融资。蒙特卡罗方法包括多次执行一个函数与随机分布的输入。并行计算工具箱,你可以换一个为
循环用parfor
循环很容易加速代码。
这个例子中运行一个简单的随机模拟基于美元拍卖。运行多个模拟来找到一美元的市场价值使用蒙特卡罗方法。在这个例子中,美元拍卖都被视为一个黑盒功能,产生输出,取决于随机过程。找到更多关于模型,明白了美元拍卖。如何加快蒙特卡罗代码一般来说,明白了使用parfor-loop估计市场价值。
美元拍卖
美元拍卖是一个零和游戏在1971年首次引入的Martin shubik2009。在游戏中,玩家一美元。玩家提出报价后,其他玩家可以选择出价高于先前的出价。拍卖结束当没有更多的球员决定放置一个出价。出价最高的人接收到一美元的钞票,但是,与一个典型的拍卖最高和第二高的出价给拍卖人投标。
随机模型
你可以使用随机模型游戏类似于美元拍卖模型。状态(当前出价和活跃玩家数量)可以使用马尔可夫过程,建模,因此结果(市场价值)预计会有定义良好的统计数据。结果来自条件分布,因此美元拍卖是理想的蒙特卡罗分析。市场价值是受到以下因素的影响:
的玩家数量,(
nPlayers
)玩家采取的行动
在这个例子中,下面的算法决定了玩家采取什么行动(招标或辍学)根据状态。
把加到前面的报价
增加
。随机选择一个球员从球员不是先前的出价。
如果以前没有报价,去8。
如果之前的出价小于1,生成一个随机数在0和1之间。如果随机数小于
dropoutRate
,去7所示。计算多少钱
获得
可以获得如果玩家得标者。计算多少钱
损失
玩家失去了如果他们出价第二高的人。如果获得
大于损失
,去8所示。玩家滴。从组中删除玩家的球员,然后去9。
玩家出价。
如果有2个或更多的玩家剩余,步骤1。
支持函数金宝appdollarAuction
模拟1美元拍卖。查看代码,看看dollarAuction.m
。这个函数接受三个输入:nPlayers
,增加
,dropoutRate
。设置的值。
nPlayers =20.;增加=
0.05;dropoutRate =
0.01;
运行一个随机场景中通过执行dollarAuction
函数。存储输出投标
和辍学
。
(投标,辍学)= dollarAuction (nPlayers、增加dropoutRate);
随着比赛的继续,一些球员报价和一些辍学的地方。如果出价超过1,球员们被关在一个“竞购战”,直到只剩下一个球员。
表辍学
包含两个变量:球员
一个惟一的编号分配给每个玩家;时代
一轮招标时球员
辍学了。使用findgroups
组dropouts.Epoch
,并使用splitapply
让球员的数量在每个独特的轮的退出dropouts.Epoch
。
[G时代]= findgroups (dropouts.Epoch);numberDropouts = splitapply (@numel, dropouts.Epoch, G);
最初,没有辍学。添加这些信息时代
和numberDropouts
通过将1
和0
。
时代=(1;时代);numberDropouts = [0; numberDropouts];
使用nPlayers
和cumsum
计算剩余的玩家数量numberDropouts
。计算投标使用增加
和时代
。使用楼梯
情节竞价的总合numberDropouts
。
playersRemaining = nPlayers - cumsum (numberDropouts);楼梯(增加*时代,playersRemaining)包含(“收购”)ylabel (“剩下的玩家数量”)
使用蒙特卡罗方法估计市场价值
你可以估计该法案的市场价值与价值origValue
利用蒙特卡罗方法。在这里,你产生一个蒙特卡罗模型和比较的速度和并行计算工具箱。设定试验的数量nTrials
用于随机样本的结果。
nTrials = 10000;
您可以通过执行示例可能的结果支持功能金宝appdollarAuction
很多次了。使用一个为
循环生产nTrials
从每个试验样本,存储最后报价B
。每次运行dollarAuction
函数,得到不同的结果。然而,当您运行的函数很多次,你从所有的生产运行的结果会有定义良好的统计数据。
记录的时间计算nTrials
模拟。减少运行时间的统计噪声,5次重复这个过程,然后将最小运行时间。
t = 0 (1、5);为j = 1:5抽搐B = 0 (1, nTrials);为i = 1: nTrials报价= dollarAuction (nPlayers、增加dropoutRate);B (i) = bids.Bid(结束);结束t (j) = toc;结束forTime = min (t)
forTime = 21.4323
使用柱状图
画一个柱状图最终的报价B
。使用参照线
与原始值叠加情节(1美元)和平均的市场价值的意思是
。
直方图(B);origLine =参照线(1,“k”,“线宽”3);marketLine =参照线(意思是(B),“k——”,“线宽”3);包含(“市场价值”)ylabel (“频率”)传说([origLine, marketLine], {“原值”,“市场价值”},“位置”,“东北”)
用给定的算法和输入参数,平均市场价值大于原始值。
使用parfor
循环评估市场价值
您可以使用并行计算工具箱很容易加速蒙特卡罗代码。首先,创建一个平行池有四个工人使用“过程”
概要文件。
p = parpool (“过程”4);
开始平行池(parpool)使用过程的概要文件…连接到平行池4工人。
取代为
循环用parfor
循环。记录的时间计算nTrials
模拟。减少运行时间的统计噪声,重复这个过程5次取最小运行时间。
t = 0 (1、5);为j = 1:5抽搐parfori = 1: nTrials报价= dollarAuction (nPlayers、增加dropoutRate);B (i) = bids.Bid(结束);结束t (j) = toc;结束parforTime = min (t)
parforTime = 5.9174
有四个工人,结果indiciate,代码可以运行/当你使用快3倍parfor
循环。
随机数的产生可重复的结果parfor
循环
当你生成随机数parfor
循环,每个循环的运行可以产生不同的结果。循环的每次迭代,创建可重复的结果必须有一个确定的随机数字生成器的状态。有关更多信息,请参见在parfor-Loops重复随机数字。
支持函数金宝appdollarAuctionStream
接受第四个参数,年代
。这支持函数金宝app使用一个指定的流产生随机数。查看代码,看看dollarAuctionStream.m
。
当您创建一个流,substreams流是统计独立的。有关更多信息,请参见RandStream
。确保您的代码每次产生相同的分布结果,创建一个随机数字生成器流的每个迭代循环,然后设置Substream
房地产循环指数。取代dollarAuction
与dollarAuctionStream
,然后用年代
运行dollarAuctionStream
一个工人。
记录的时间计算nTrials
模拟。减少运行时间的统计噪声,5次重复这个过程,然后将最小运行时间。
t = 0 (1、5);为j = 1:5抽搐parfori = 1: nTrials s = RandStream (“Threefry”);年代。Substream =我;报价= dollarAuctionStream (nPlayers,增加dropoutRate s);B (i) = bids.Bid(结束);结束t (j) = toc;结束parforTime = min (t)
parforTime = 8.7355
从桌面到集群规模
你可以从你的桌面代码规模和更多的工人一个集群。关于扩大的更多信息从桌面到一个集群,明白了从桌面到集群规模。
使用删除
关闭现有的并行池。
删除(p);
计算支持功能金宝appdollarAuctionStream
在一个parfor
循环。运行相同的parfor
循环与不同数量的工人,并记录运行时间。为了减少运行时间统计噪音,运行parfor
循环五次,然后把最小运行时间。记录的最低次数组elapsedTimes
。在以下代码中,替换MyCluster
集群的配置文件的名称。
工人= [1 2 4 8 16 32];elapsedTimes = 0(1,元素个数(工人));%使用“MyCluster”集群配置文件创建一个池p = parpool (“MyCluster”、32);
开始平行池(parpool)使用“MyCluster”概要文件…连接到平行池(工人数量:32)。
为k = 1:元素个数(工人)t = 0 (1、5);为j = 1:5抽搐parfor(i = 1: nTrials,工人(k)) s = RandStream (“Threefry”);年代。Substream =我;报价= dollarAuctionStream (nPlayers,增加dropoutRate s);B (i) = bids.Bid(结束);结束t (j) = toc;结束elapsedTimes (k) = min (t);结束
工人们…做分析和传输文件。
计算计算加速除以elapsedTimes (1)
《纽约时报》的elapsedTimes
。检查强大的扩展通过绘制加速对工人的数量。
加速= elapsedTimes (1)。/ elapsedTimes;情节(工人,加速)包含(工人的数量)ylabel (“计算加速”)
计算加速增加工人的数量。