【实验】实验七 MATLAB 并行计算20211125

本文仅供学习和复习使用。 题目源于岑冠军老师,答案参考自相关课件,另外借以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。

三、实验内容

  1. 开启具有5个worker的并行计算池。
parpool('local', 5);
  1. 采用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)
  1. 请指出下列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

% Notes: 
% Loop Variables: Loop indices
% Sliced Variables: Arrays whose segments are operated on by different iterations of the loop
% Broadcast Variables: Variables defined before the loop whose value is required inside the loop, but never assigned inside the loop
% Reduction Variables: Variables that accumulates a value across iterations of the loop, regardless of iteration order
% Temporary Variables: Variables created inside the loop, and not accessed outside the loop
  1. 体验spmd编程——单个程序,多个数据(本题选做)。
    (1) 开启4个worker的并行计算池;
    (2) 接着运行以下代码,请问变量c和d包含几个元素?为什么?
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值