我有一个小的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)
警告消失但我不喜欢这个任务。 代码被明确设计为搞乱缓存内存。
答案 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
与此约束不匹配。