主要内容

使用21点对PARFOR进行简单的基准测试

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

相关例子:

并行版本

基本的并行算法使用parfor构造,以独立地执行循环。它是MATLAB®语言的一部分,但本质上像一个规则-loop,如果您不能访问并行计算工具箱™产品。因此,我们的第一步是转换表单的循环

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

到相当于parfor循环:

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

我们通过指定一个可选参数来稍微修改一下parfor,指示它限制到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结束

检查并行池状态

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

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

运行基准测试:弱缩放

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

numHands = 2000;numPlayers = 6;流(“模拟每个玩家玩%d手。\n”, numHands);t1 = 0 (1, poolSize);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®循环。

抽搐;S = 0 (numHands, numPlayers);i = 1:numPlayers S(:, i) = pctdemo_task_blackjack(numHands, 1);结束t1 (1) = toc;流('使用连续的for循环在%3.2f秒内运行。\n', t1 (1));
使用连续的for循环在10.70秒内运行。

绘制加速

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

加速= (1:poolSize)。* t1 (1) / t1;无花果= pctdemo_setup_blackjack (1.0);fig.Visible =“上”;ax =轴(“父”图);x = plot(ax, 1:poolSize, 1:poolSize,)“——”...1: poolSize,加速,“年代”“MarkerFaceColor”“b”);t = ax.XTick;T (T ~= round(T)) = [];%删除所有非整数x轴刻度。斧子。XTick = t;传奇(x,“线性加速”“测量加速”“位置”“西北”);包含(ax,“参与计算的MATLAB工作者数量”);ylabel (ax,“加速”);

测量加速分布

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

numIter = 100;t2 = 0 (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次中运行了40次。基准指数在100次中运行了60次。基准指数在100次中运行了80次。基准指数已经运行了100次。

绘制加速分布图

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

加速= t1(1)。/ t2 * poolSize;clf(图);ax =轴(“父”图);嘘(加速,5);=轴(ax);(4) = 5 *装天花板((4)/ 5);% y轴转到最接近5的倍数。轴(ax)包含(ax,“加速”);ylabel (ax,“频率”);标题(ax, sprintf ('Speedup of parfor with %d workers'poolSize));m =值(加速);流([“中值加速是%3.2f,它对应于”...“% 3.2 f。\ n效率”), m, m / poolSize);
中位加速值为43.37,对应效率值为0.68。