【问题标题】:parfor multi core processing matlabparfor 多核处理 matlab
【发布时间】:2015-12-06 03:24:25
【问题描述】:

我有一个函数文件,它模拟了 1000 个时间步长的矩阵 A(大小为 100*100),并生成最终结果为 A_t1000(大小为 100*100 的矩阵)。

例如如果 A = 100*100 在 t0 则 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”参数越大,仅“for”循环运行代码所需的时间就越长。目前较大的参数在没有 parfor 的情况下需要超过 30 小时才能运行。我想使用 parfor 显着减少这个时间。

有什么建议吗?谢谢!

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

    初始化使用:

    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之后进行转换。

    【讨论】:

    • 谢谢。会试试这个,让你知道它是如何工作的。我目前通过将 Bs 转换为元胞数组来运行它。希望它会显着减少运行时间。
    【解决方案2】:

    您代码中的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 定义为元胞数组。有时它使事情更容易理解。

    【讨论】:

    • 谢谢。会试试这个,让你知道它是如何工作的。我目前通过将 Bs 转换为元胞数组来运行它。希望它会显着减少运行时间。
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多