parfor多核处理matlab

时间:2015-12-06 03:24:26

标签: matlab

我有一个函数文件,模拟矩阵A(大小为100 * 100),持续1000个步骤,并生成最终结果为A_t1000(大小为100 * 100矩阵)。

E.g。如果在t0时A = 100 * 100则A_t1 = 100 * 100; A_t2 = 100 * 100; ...... .. A_t1000 = 100 * 100矩阵。每个都有不同的值,所以我可以从A_t1到A_t1000有多个A切片。

我的脚本文件迭代此过程100次迭代。脚本文件调用此函数并生成最终输出矩阵B_t1000 = A_t1000 * 100.B_t1000是包含100个As的最终输出矩阵。 B_t1000尺寸为100 * 100 * 100。函数文件的起始输入参数在脚本文件的开头提供。

我正在尝试使用'parfor'来运行此代码。目的是在独立的核心中独立运行每个迭代,然后在最后收集它们以生成B.当前代码看起来像---

iter=100; 
p=0.8;N=1200;
maxgen=1000;
d=0.01; 
evalues=(d/2):d:(1-d/2); 
cvalues=(d/2):d:(1-d/2); %% p, N are starting parameters 
[C,E]=meshgrid(cvalues,evalues); %% Starting 10,000 combinations 

B_t1000 = []; %% initializing B_t1000
B_t200= []; %% initializing B_t200

parfor k=1:iter  

A_t1000= zeros(length(evalues),length(cvalues)); %%initializing A_t1000
A_t200 = zeros(length(evalues),length(cvalues)); %%initializing A_t200
for i=1:length(evalues)
for j=1:length(cvalues)
    e=evalues(i); % starting point input for e for function file
    c=cvalues(j); % starting point input for c for function file
   [A_t1000, A_t200] = function (e,c,p,N,maxgen); %% calling a function to generate A_t1000 and A_t200           
end
end

B_t1000 (1:length(evalues),1:length(cvalues),k) = A_t1000;
B_t200  (1:length(evalues),1:length(cvalues),k) = A_t1000;
end

我收到错误消息 - " parfor中的变量B_t1000无法分类"。它与我认为的独立性和索引问题有关。

任何人都可以帮我使用parfor运行此代码吗?

更大的' Ne'和' maxgen'参数运行代码的时间越长,仅用于'环。目前较大的参数在没有parfor的情况下运行> 30小时。我希望使用parfor显着减少这个时间。

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:0)

将结果的数据类型更改为单元格数组。

初始化使用:

B_t1000 = cell(1,iter); %% initializing B_t1000
B_t200= cell(1,iter); %% initializing B_t200

然后在parfor循环中执行

B_t1000{k} = A_t1000;
B_t200{k} = A_t1000;

如果您确实需要将结果作为3D矩阵,请在parfor后转换它们。

答案 1 :(得分:0)

代码中的

B_t1000和B_t200是parfor循环中的切片变量。您的代码存在的问题是,parfor的循环变量(在您的情况下为k)只能用作第一级索引,您可以将其用作第三级索引。

请参阅官方MATLAB文件: http://nl.mathworks.com/help/distcomp/sliced-variables.html

快速修复代码,将初始化代码更改为:

B_t1000 = zeros(iter,length(evalues),length(cvalues)); %% initializing B_t1000
B_t200= zeros(iter,length(evalues),length(cvalues)); %% initializing B_t200

并将parfor循环中的分配更改为:

B_t1000 (k,:,:) = A_t1000;
B_t200  (k,:,:) = A_t1000;

现在parfor循环变量k用作B_t1000和B_t200的第一级索引。您还可以将B_t1000和B_t200定义为单元阵列。有时它会让事情变得更容易理解。