主要内容

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

此示例对parfor通过反复玩21点纸牌游戏来构建。我们使用parfor并行地玩纸牌游戏多次,改变MATLAB®工作人员的数量,但始终使用相同数量的玩家和手。

相关例子:

并行版本

基本并行算法使用parfor构造来通过循环执行独立的传递。它是MATLAB®语言的一部分,但本质上像常规语言一样-loop,如果您没有访问并行计算工具箱™产品的权限。因此,我们的初始步骤是转换表单的循环

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

变成等价的parfor循环:

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

我们通过指定一个可选参数来对其稍加修改parfor,指示其限制到n它用于计算的工作者的数量。实际代码如下:

dbtypepctdemo_aux_parforbench
1函数S = pctdemo_aux_parforbench(numHands, numPlayers, n) 2% pctdemo_aux_parforbench使用parfor玩21点。3% S = pctdemo_aux_parforbench(numHands, numPlayers, n)玩4%的21点numPlayers手,并使用不超过5%的MATLAB(R)工作者进行计算。8 9 S = 0 (numHands, numPlayers);10 parfor (i = 1:numPlayers, n) 11 S(:, i) = pctdemo_task_blackjack(numHands, 1);12结束

检查并行池状态

我们将用平行池来允许身体的parfor循环以并行运行,因此我们首先检查池是否打开。然后,我们将使用2和poolSize这个池子里的工人。

P = gcp;如果isempty (p)错误(“pctexample: backslashbench: poolClosed”...“这个例子需要一个平行池。”...使用parpool命令或set手动启动一个池...'你的并行偏好自动启动一个池']);结束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;流('% 3.2f秒内模拟%d个玩家。\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 = axes(“父”图);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;pctdemo_aux_parforbench(numHands, poolSize*numPlayers, poolSize);T2 (i) = toc;如果Mod (i,20) == 0'基准已经运行了%d次。\n',我,numIter);结束结束
基准测试在100次测试中跑了20次。基准测试在100次测试中跑了40次。基准测试在100次测试中运行了60次。基准测试在100次测试中跑了80次。基准测试已经运行了100次。

绘制加速分布

我们仔细研究一下在使用最大工作数时,简单并行程序的加速情况。加速的直方图允许我们区分异常值和平均加速。

speedup = t1(1)./t2*poolSize;clf(图);Ax = axes(“父”图);嘘(加速,5);A =轴(ax);A (4) = 5*ceil(A (4)/5);圆y轴到5的最接近倍数。Axis (ax, a) xlabel(ax, a)“加速”);ylabel (ax,“频率”);标题(ax, sprintf (“与%d的工人加速parfor”poolSize));M =中位数(加速);流(['中值加速为%3.2f,对应于'...' %3.2f.\n'的效率, m, m/poolSize);
加速中值为43.37,对应于0.68的效率。