首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >parfor多核处理matlab

parfor多核处理matlab
EN

Stack Overflow用户
提问于 2015-12-06 11:24:26
回答 2查看 79关注 0票数 0

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

例如,如果A= 100*100 at 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个A的最终输出矩阵。B_t1000维度为100*100*100。函数文件的起始输入参数在脚本文件的开头提供。

我正在尝试使用‘parfor’来运行这段代码。目标是在单独的核心中独立运行每个迭代,然后在结束时收集它们以生成B。当前代码如下所示

代码语言:javascript
复制
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显著减少这一时间。

有什么建议吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-12-06 13:57:14

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

要初始化使用:

代码语言:javascript
复制
B_t1000 = cell(1,iter); %% initializing B_t1000
B_t200= cell(1,iter); %% initializing B_t200

然后在parfor循环中

代码语言:javascript
复制
B_t1000{k} = A_t1000;
B_t200{k} = A_t1000;

如果您确实需要将结果转换为3D矩阵,则在parfor之后对其进行转换。

票数 0
EN

Stack Overflow用户

发布于 2015-12-06 21:44:56

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

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

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

代码语言:javascript
复制
B_t1000 = zeros(iter,length(evalues),length(cvalues)); %% initializing B_t1000
B_t200= zeros(iter,length(evalues),length(cvalues)); %% initializing B_t200

并将parfor循环中的赋值更改为:

代码语言:javascript
复制
B_t1000 (k,:,:) = A_t1000;
B_t200  (k,:,:) = A_t1000;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34113662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档