Matlab并行计算工具箱™ ,使我们能够在集群电脑上执行我们的MATLAB ®程序。在本演示中,我们看看如何划分一个拥有大量操作的MATLAB集合成较小的工作单位,我们称这些工作单位为任务,其中每个任务可以在在我们的群集计算机中执行。我们将使用pctdemo_helper_split_scalar和pctdemo_helper_split_vector函数来实现这些功能。
内容目录
1. 获得配置
2. 开始顺序代码
3. 分析顺序问题
4. 示例:划分一个仿真到多任务中
5. 示例:划分一个参数序列到多任务中
6. 更多的参数序列
7. 划分Matlab操作到多任务中:最佳实践
这一部分,将讲解第4节。1-3节见,上一篇文章以多任务分布Matlab的计算(1)-顺序代码
实例:划分任务
下面的程序非常小,我们将使用rand函数,作为研究对象。假设我们有4个worker的集群。我们希望划分rand(1, 10);任务。我们将使用4个任务,产生长度分别为3,3,2和2的随机向量。这些,可以通过一个非常简单的函数达到:
y = dfeval(@rand, {[1, 3], [1, 3], [1, 2], [1, 2]}, 'Configuration', configName);
celldisp(y)
y{1} =
0.5488 0.7152 0.6028
y{2} =
0.9173 0.6839 0.8661
y{3} =
0.2951 0.0990
y{4} =
0.3527 0.9411
当然,你也可以通过createJob和createTask达到同样的效果。我们已经创建了一个pctdemo_helper_split_scalar函数,用于为4个任务划分10个随机数。
numRand = 10; % We want this many random numbers.
numTasks = 4; % We want to split into this many tasks.
sched = findResource('scheduler', 'Configuration', configName);
job = createJob(sched);
[numPerTask, numTasks] = pctdemo_helper_split_scalar(numRand, numTasks);
注意pctdemo_helper_split_scalar是如何把10个随机数的生成划分到numTasks个任务中的。numPerTask里的元素都是正数,该矩阵的长度是numTasks,它们的和等于numRand:
disp(numPerTask)
3
3
2
2
现在,我们写一个for循环,创建作业中的每个任务。Task i会创建1-到-numPerTask(i)的矩阵。当所有任务都创建好了后,我们提交这些任务,等待它们返回,然后得到结果。
for i = 1:numTasks
createTask(job, @rand, 1, {1, numPerTask(i)});
end
submit(job);
waitForState(job, 'finished');
y = getAllOutputArguments(job);
cat(2, y{:}) % Concatenate all the cells in y into one column vector.
destroy(job);
ans =
Columns 1 through 9
0.5488 0.7152 0.6028 0.9173 0.6839 0.8661 0.2951 0.0990 0.3527
Column 10
0.9411