分享你我的资源分享我们的人生!
当前位置: 首页 >> 文章列表

以多任务分布Matlab的计算(2)-并行循环拆分

Example: Dividing a Simulation into Tasks

9/21/2008 11:36:17 AM
本文继续以实例介绍,Matlab并行工具箱的使用,对一个矩阵进行多任务的划分。

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
 

京ICP备08011023号