我现在正在努力应对Matlab parfor透明度要求。据我所知,透明度要求不允许使用任何变量,因为许多工作人员将一遍又一遍地读/写同一个变量。当我四处搜寻时,没有互斥或任何阻止这种情况发生的事情。
就代码而言,这是一个简单的例子:
a = 0;
realDataIneed = [];
parfor i = 1:10
a = a+i
realDataIneed = [realDataIneed a];
end
在这种情况下,如果parfor是for,那么realDataIneed将只是[1 3 6 ...]
,这是一个很好的可预测序列。在多处理范例中,每个工作者是否会重复并以不可预测的方式访问同一个变量?
(在我看来,拥有一个数组,每个工作者访问由数组索引指定的变量更合理,因为不会发生冲突,尽管读取和写入同一个数组也可能有问题。)
有人可以详细说明这件事吗?谢谢!
答案 0 :(得分:1)
这不是透明度问题(那些是parfor
是否可以从程序文本中看到循环中使用了哪些变量);相反,这是一个变量分类问题。 parfor
支持循环中的两种输出:
在您的情况下,a
单独使用将是减少输出,因为它以正确的形式更新。连接也是一种有效的缩减形式 - 但不幸的是,求和和连接的组合不是有效的缩减。基本上,你在这里想要实现的是MATLAB的cumsum
,这不是关联的(这是parfor
减少的要求。)
在这种情况下我要做的只是发出值向量,然后在MATLAB客户端执行cumsum
。 E.g。
parfor i = 1:10
a(i) = i;
end
realDataIneed = cumsum(a);