MATLAB parfor如何切割矩阵

时间:2014-07-30 11:48:58

标签: matlab parfor

我有一个小的parfor测试脚本,它在标题中给出了警告。 代码就是这个

out = zeros(10, 1);
in = rand(5e8, 10);
tic
parfor i = 1:10
    for j = 1:5e8
        p = floor(rand(1,1)*5e8);
        out(i) = out(i) + in(p, i);
    end
end
toc
tot = sum(out)

关于如何访问变量in的第7行出现警告。 我不明白为什么,切片应该是微不足道的。只需将每列输入发送给每个工作人员。 如果我将代码更改为

out = zeros(10, 1);
in = rand(5e8, 10);
tic
parfor i = 1:10
    a = in(:,i);
    for j = 1:5e8
        p = floor(rand(1,1)*5e8);
        out(i) = out(i) + a(p);
    end
end
toc
tot = sum(out)

警告消失但我不喜欢这个任务。 代码被明确设计为搞乱缓存内存。

1 个答案:

答案 0 :(得分:1)

不幸的是,正如http://www.mathworks.com/help/distcomp/advanced-topics.html#bq_of7_-1所解释的那样,MATLAB不了解如何切片in,因此代码分析器警告。您必须非常仔细地阅读该页面,以了解为何无法切片。相关段落是:

  

索引形式。在切片变量的索引列表中,这些索引之一的形式为i,i + k,i-k,k + i或k-i,其中i   是循环变量,k是常数或简单(非索引)   广播变量; 和其他所有索引都是标量常量,a   简单的广播变量,冒号或结尾。

最后以粗体显示的子句是相关的 - 在您的情况下,p与此约束不匹配。