本文仅供学习和复习使用。 题目源于岑冠军老师,答案参考自相关课件,另外借以markdown排版成此文。由于本人水平有限且时间不够充裕,故难免有错漏或不当之处,如有建议或批评还请联系penguinpi@163.com,谢谢!
实验七 MATLAB 并行计算
@Copyright 华南农业大学 数学与信息学院 数学系 主讲与制作:岑冠军
一、实验目的
- 掌握基本MATLAB的并行计算概念与环境;
- 能开启本地MATLAB并行计算池;
- 熟悉基于tall数组的大型数据文件处理;
- 了解parfor、spmd并行计算使用。
二、实验原理
- 并行计算基础:client,worker,cluster、parallel pool;
- 配置并行计算环境:parcluster,parpool;
- 基于tall数组的大型数据集合的计算:spreadsheetDataStore,tall,gather,matlab.tall.transform,matlab.tall.reduce;
- 内置的并行计算结构:parfor,spmd。
三、实验内容
- 开启具有5个worker的并行计算池。
parpool('local', 5);
- 采用tall数组,对第八讲案例’附件1:用户收视信息.xlsx’数据,计算日平均点播时长小于4小时的用户的平均点播观看时间。
userds = spreadsheetDatastore("附件1:用户收视信息.xlsx", "PreserveVariableNames", true, "Sheets", "用户单片点播信息");
% preview(userds)
selectNames = {'统计日期','二级目录','影片名称','观看开始时间','观看结束时间','用户号'};
variableNames = {'StatDate','Catalogue','ProgramName','StartTime','EndTime','UserID'};
userds.VariableNames(matches(userds.SelectedVariableNames, selectNames)) = variableNames;
userds.SelectedVariableNames = variableNames;
userds.SelectedVariableTypes = {'categorical','categorical','string', 'datetime','datetime','categorical'};
% preview(userds)
UT = tall(userds);
% head(UT, 2)
% summary(UT)
UT.WatchTime = UT.EndTime - UT.StartTime;
gsUT = groupsummary(UT,{'UserID', 'StatDate'}, 'sum', 'WatchTime');
gmUT = groupsummary(gsUT,{'UserID'}, 'mean', 'sum_WatchTime');
gather(gmUT)
% head(UT, 2)
% duration 固定长度单位的时间长度
% matlab.tall.reduce
% tA = matlab.tall.reduce(fcn,reducefcn,tX) 将函数 fcn 应用于数组 tX 的每个块...
% 以生成部分结果。然后,该函数将 reducefcn 重复应用于部分结果的垂直串联,直到它得到一个最终结果 tA。
% 关于 duration 请参考 https://ww2.mathworks.cn/help/matlab/ref/duration.html
% 关于 matlab.tall.reduce 请参考 https://ww2.mathworks.cn/help/matlab/ref/matlab.tall.reduce.html
gt1hUT = matlab.tall.reduce( @(X)X(X>duration(4,00,00)) , @(x)mean(x,'omitnan'), gmUT.mean_sum_WatchTime );
gather(gt1hUT)
- 请指出下列parfor循环代码中,变量a,z,b,r,d各是什么类型的变量?
a = 0;
c = pi;
z=0;
r=rand(1,10);
parfor i = 1:10
a = i;
z = z + i;
b(i) = r(i);
if i <= c
d = 2*a;
end
end
% a: temporary var
% z: reduction var
% b: sliced (output) var
% r: sliced (input) var
% d: temporary var
- 体验spmd编程——单个程序,多个数据(本题选做)。
(1) 开启4个worker的并行计算池; (2) 接着运行以下代码,请问变量c和d包含几个元素?为什么?
ppar = gcp('nocreate'); % 获取当前并行计算池
if isempty(ppar) % 如果当前并行计算池为空
myCluster = parcluster('local'); % 以本地配置文件创建集群
myCluster.NumWorkers=8; % 设置集群的work数目
p=parpool(myCluster,8); % 在集群上启动并行计算池
end
delete(gcp('nocreate')) % 关闭当前并行计算池
parpool('local', 4);
for i=1:4
dlmwrite(['spmdt',num2str(i),'.txt'],rand(2*i));
end
spmd
a= dlmread(['spmdt',num2str(labindex),'.txt']);
b=a(:);
c=mean(b);
d=std(b);
end
|