Matlab:parfor 透明度要求是否意味着不能使用非向量变量?

Matlab: does parfor transparency requirement implies no non-vector variables can be used?

我现在正在为 Matlab parfor 透明度要求而苦苦挣扎。就我的理解而言,透明度要求不允许使用任何变量,因为许多工作人员将 reading/writing 一遍又一遍地使用同一个变量。当我四处搜索时,没有互斥体或任何阻止这种情况发生的东西。

代码方面,举个简单的例子:

a = 0;
realDataIneed = [];
parfor i = 1:10
    a = a+i
    realDataIneed = [realDataIneed a];
end

在这种情况下,如果 parfor 用于,则 realDataIneed 将只是 [1 3 6 ...],一个很好的可预测序列。在多处理范例中,每个工作人员是否会重叠并不可预测地访问相同的变量?

(我觉得有一个数组让每个worker访问它的数组索引指定的变量更合理,因为不会发生冲突,虽然读写同一个数组也可能有问题。)

有人可以详细说明这个问题吗?谢谢!

这不是透明度的问题(那些是关于parfor能否从程序的文本中看出循环内使用了哪些变量);相反,这是一个变量分类问题。 parfor 支持两种类型的循环输出:

  1. sliced 由循环变量索引的输出
  2. reduction 使用公认的 reduction
  3. 形成的输出

在您的情况下,单独使用 a 将是缩减输出,因为它以正确的形式更新。串联也是一种有效的归约形式——但不幸的是,求和和串联的组合不是有效的归约。基本上,您在这里要实现的是 MATLAB 的 cumsum,而这不是关联的(这是减少 parfor 的要求)。

在这种情况下,我要做的只是发出值向量,然后在 MATLAB 客户端执行 cumsum。例如

parfor i = 1:10
    a(i) = i;
end
realDataIneed = cumsum(a);