主要内容

使用Brickjack的Parcom的简单基准

这个例子对par通过反复播放Blackjack的纸牌游戏,也称为21.我们使用par可以并行玩多次纸牌游戏,改变MATLAB®工作人员的数量,但始终使用相同数量的玩家和手。

相关例子:

并行版本

基本的并行算法使用par构造以执行独立的通过循环。它是MATLAB®语言的一部分,但表现得实质上是常规的- 如果您无权访问并行计算工具箱™产品,则为。因此,我们的初始步骤是转换表单的循环

i = 1:numPlayers S(:, i) = playBlackjack();结束

到相当于par环形:

pari = 1:numPlayers S(:, i) = playBlackjack();结束

我们通过指定可选参数来稍微修改此项par,指示它限制到N.它用于计算的工人数量。实际代码如下:

dbtypepctdemo_aux_parforbench.
1 function S = pctdemo_aux_parforbench(numHands, numPlayers, n) 2% pctdemo_aux_parforbench使用parfor玩21点。3 % S = pctdemo_aux_parforbench(numHands, numPlayers, n)玩4 % numHands手的21点numPlayers次,并使用不超过5 %的MATLAB(R)工人的计算。6 7 % Copyright 2007-2009 The MathWorks, Inc. 8 9 S = zeros(numHands, numPlayers);10 parfor (i = 1:numPlayers, n) 11 S(:, i) = pctdemo_task_blackjack(numHands, 1);12结束

检查并行池的状态

我们将使用并行池允许身体par循环以并行运行,因此我们首先检查池是否打开。然后我们将使用2和之间的任意位置运行基准测试poolSize水池里的工人。

p = gcp;如果isempty (p)错误(“pctexample: backslashbench: poolClosed”......[“这个例子需要一个并行池。”......使用parpool命令或set命令手动启动一个pool......"你的平行偏好自动启动池"]);结束poolSize = p.NumWorkers;

运行基准:弱缩放

我们使用2来计时基准计算的执行时间poolSize工人。我们使用弱扩展,也就是说,我们随着工人的数量增加问题的规模。

numHands = 2000;numPlayers = 6;流('模拟每个玩家播放%d手。\ n',numhands);T1 =零(1,池化);n = 2:poolSize tic;pctdemo_aux_parforbench (numHands n * numPlayers, n);t1 (n) = toc;流('%d workers在%3.2f秒内模拟%d players .\n'......n, n * numPlayers, t1 (n));结束
模拟每个玩家玩2000手。2名工人在10.81秒内模拟12名玩家。3名工人在10.67秒内模拟了18名玩家。4名工人在10.57秒内模拟24名玩家。5名工人在10.57秒内模拟30名玩家。6名工人在10.71秒内模拟了36名玩家。7名工人在10.63秒内模拟了42名玩家。8名工人在10.87秒内模拟了48名玩家。9名工人在10.54秒内模拟了54名玩家。10名工人在10.73秒内模拟了60名玩家。 11 workers simulated 66 players in 10.58 seconds. 12 workers simulated 72 players in 10.68 seconds. 13 workers simulated 78 players in 10.56 seconds. 14 workers simulated 84 players in 10.89 seconds. 15 workers simulated 90 players in 10.62 seconds. 16 workers simulated 96 players in 10.63 seconds. 17 workers simulated 102 players in 10.70 seconds. 18 workers simulated 108 players in 10.70 seconds. 19 workers simulated 114 players in 10.79 seconds. 20 workers simulated 120 players in 10.72 seconds. 21 workers simulated 126 players in 10.74 seconds. 22 workers simulated 132 players in 10.75 seconds. 23 workers simulated 138 players in 10.74 seconds. 24 workers simulated 144 players in 10.72 seconds. 25 workers simulated 150 players in 10.74 seconds. 26 workers simulated 156 players in 10.76 seconds. 27 workers simulated 162 players in 10.74 seconds. 28 workers simulated 168 players in 10.72 seconds. 29 workers simulated 174 players in 10.76 seconds. 30 workers simulated 180 players in 10.69 seconds. 31 workers simulated 186 players in 10.76 seconds. 32 workers simulated 192 players in 10.76 seconds. 33 workers simulated 198 players in 10.79 seconds. 34 workers simulated 204 players in 10.74 seconds. 35 workers simulated 210 players in 12.12 seconds. 36 workers simulated 216 players in 12.19 seconds. 37 workers simulated 222 players in 12.19 seconds. 38 workers simulated 228 players in 12.14 seconds. 39 workers simulated 234 players in 12.15 seconds. 40 workers simulated 240 players in 12.18 seconds. 41 workers simulated 246 players in 12.18 seconds. 42 workers simulated 252 players in 12.14 seconds. 43 workers simulated 258 players in 12.24 seconds. 44 workers simulated 264 players in 12.25 seconds. 45 workers simulated 270 players in 12.23 seconds. 46 workers simulated 276 players in 12.23 seconds. 47 workers simulated 282 players in 12.55 seconds. 48 workers simulated 288 players in 12.52 seconds. 49 workers simulated 294 players in 13.24 seconds. 50 workers simulated 300 players in 13.28 seconds. 51 workers simulated 306 players in 13.36 seconds. 52 workers simulated 312 players in 13.53 seconds. 53 workers simulated 318 players in 13.98 seconds. 54 workers simulated 324 players in 13.90 seconds. 55 workers simulated 330 players in 14.29 seconds. 56 workers simulated 336 players in 14.23 seconds. 57 workers simulated 342 players in 14.25 seconds. 58 workers simulated 348 players in 14.32 seconds. 59 workers simulated 354 players in 14.26 seconds. 60 workers simulated 360 players in 14.34 seconds. 61 workers simulated 366 players in 15.60 seconds. 62 workers simulated 372 players in 15.75 seconds. 63 workers simulated 378 players in 15.79 seconds. 64 workers simulated 384 players in 15.76 seconds.

我们使用常规将此与执行进行比较在MATLAB®循环。

Tic;s =零(numhands,numplayers);i = 1:numPlayers S(:, i) = pctdemo_task_blackjack(numHands, 1);结束t1 (1) = toc;流(“使用顺序循环运行%3.2F秒。\ n', t1 (1));
使用连续的for循环在10.70秒内运行。

绘制加速

我们比较使用的加速par用不同数量的工人达到完美的线性加速曲线。通过使用实现的加速par这取决于问题的大小以及底层硬件和网络基础设施。

speedup =(1:poolsize)。* t1(1)./ t1;图= pctdemo_setup_blackjack(1.0);图可视='在';斧头=轴('父母'图);x = plot(ax, 1:poolSize, 1:poolSize,)“——”......1:池化,加速,s“MarkerFaceColor”'B');t = ax.XTick;T (T ~= round(T)) = [];%删除所有非整数x轴刻度。斧子。XTick = t;传奇(x,'线性加速'“测量加速”“位置”'西北');包含(ax,'参加计算的Matlab工人数量');ylabel(斧头,“加速”);

测量加速分布

为了获得可靠的基准数据,我们需要多次运行基准。因此,我们为poolSize工人让我们看看加速的传播。

numiter = 100;t2 =零(1,numiter);i = 1:numIter tic;pctdemo_aux_parforbench (numHands poolSize * numPlayers poolSize);t2 (i) = toc;如果Mod (i,20) == 0'基准已超过%d次运行%d。\ n',我,numIter);结束结束
基准已超过100次运行20。基准测试已超过100次。基准已运行60次。基准已运行80次。基准已超过100次运行100次。

绘制加速分布图

我们仔细看看当使用最大worker数量时简单并行程序的加速。加速的直方图允许我们区分异常值和平均加速值。

speedup = t1(1)./ t2 * poolsize;CLF(图);斧头=轴('父母'图);stay(加速,5);a =轴(ax);A(4)= 5 * CEIL(a(4)/ 5);% y轴转到最接近5的倍数。轴(斧头,a)xlabel(ax,“加速”);ylabel(斧头,“频率”);标题(AX,Sprintf('Speedup of parfor with %d workers'poolSize));m =值(加速);流(['中位超速量是%3.2f,它对应于'......'%3.2f的效率。\ n'],m,m / poolsize);
中位的加速是43.37,其对应于0.68的效率。