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

以多任务分布Matlab的计算(3)-划分一个参数序列到多任务中

Example: Dividing a Parameter Sweep into Tasks

9/21/2008 11:40:32 AM
文章介绍如何划分参数型的多任务序列。

Matlab并行计算工具箱™ ,使我们能够在集群电脑上执行我们的MATLAB ®程序。在本演示中,我们看看如何划分一个拥有大量操作的MATLAB集合成较小的工作单位,我们称这些工作单位为任务,其中每个任务可以在在我们的群集计算机中执行。我们将使用pctdemo_helper_split_scalar和pctdemo_helper_split_vector函数来实现这些功能。

内容目录
1. 获得配置
2. 开始顺序代码
3. 分析顺序问题
4. 示例:划分一个仿真到多任务中
5. 示例:划分一个参数序列到多任务中
6. 更多的参数序列
7. 划分Matlab操作到多任务中:最佳实践

这一部分,将讲解第5-6节。1-3节见,上一篇文章以多任务分布Matlab的计算(1)-顺序代码,第4节见以多任务分布Matlab的计算(2)-并行循环拆分

5. 示例:划分一个参数序列到多任务中

这节,我们将使用sin函数,做简单的例子。首先,让x作为一个长度10的矩阵:
x = 0.1:0.1:1;

现在,我们希望把sin(x)划分到4个计算机的集群中。我们希望4个机器分别同时执行sin(x(1:3)), sin(x(4:6)), sin(x(7:8))和sin(x(9:10))。因为,这种划分参数序列到多个任务的情况非常常见,所以,我们也做了一个函数:

numTasks = 4;
[split, numTasks] = pctdemo_helper_split_vector(x, numTasks);
celldisp(split);

split{1} =
    0.1000    0.2000    0.3000
split{2} =
    0.4000    0.5000    0.6000
split{3} =
    0.7000    0.8000
split{4} =
    0.9000    1.0000

现在,无论使用dfeval,还是createJob和createTask,都很容易执行计算了。
 

y = dfeval(@sin, split, 'Configuration', configName);
cat(2, y{:})  % Concatenate all the cells in y into one column vector.


ans =
  Columns 1 through 9
    0.0998    0.1987    0.2955    0.3894    0.4794    0.5646    0.6442    0.7174    0.7833
  Column 10
    0.8415

亦或,

job = createJob(sched);
for i = 1:numTasks
   createTask(job, @sin, 1, {split{i}});
end
submit(job);
waitForState(job, 'finished');
y = getAllOutputArguments(job);
destroy(job);
cat(2, y{:})  % Concatenate all the cells in y into one column vector.


ans =
  Columns 1 through 9
    0.0998    0.1987    0.2955    0.3894    0.4794    0.5646    0.6442    0.7174    0.7833
  Column 10
    0.8415

 

更多的参数序列


上面的sin函数是非常简单的,因为,所有参数都是矢量化的。非矢量化的,参考以后的文章:)