1

我有一个小 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 行。我不明白为什么,切片应该是微不足道的。只需将 in 的每一列发送给每个工人。如果我将代码更改为

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)

警告消失了,但我不喜欢对 a 的分配。该代码被明确设计为破坏高速缓存。

4

1 回答 1

1

不幸的是,正如这里解释的http://www.mathworks.com/help/distcomp/advanced-topics.html#bq_of7_-1,MATLAB 不了解如何切片in,因此代码分析器警告。您必须仔细阅读该页面才能理解为什么不能对其进行切片。相关段落是:

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

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

于 2014-07-30T14:11:53.293 回答