主要内容

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

此示例对parfor通过反复玩21点纸牌游戏构建,也称为21。我们使用parfor并行玩纸牌游戏多次,改变MATLAB®工人的数量,但总是使用相同数量的玩家和手。

相关例子:

并行版本

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

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

变成等价物parfor循环:

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

我们通过指定一个可选参数来稍微修改一下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 % numHands的21点numPlayers次,并且使用不超过n个MATLAB(R) worker进行计算。8 9 S =零(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;流('%d个工人在%3.2f秒内模拟%d个玩家。'...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.

我们将其与使用常规语句的执行进行比较-loop在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这取决于问题的大小以及底层硬件和网络基础设施。

speedup = (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次中的100次。

绘制加速分布

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

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