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

时间:2015-09-04 05:00:29

标签: matlab parallel-processing

我现在正在努力应对Matlab parfor透明度要求。据我所知,透明度要求不允许使用任何变量,因为许多工作人员将一遍又一遍地读/写同一个变量。当我四处搜寻时,没有互斥或任何阻止这种情况发生的事情。

就代码而言,这是一个简单的例子:

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

在这种情况下,如果parfor是for,那么realDataIneed将只是[1 3 6 ...],这是一个很好的可预测序列。在多处理范例中,每个工作者是否会重复并以不可预测的方式访问同一个变量?

(在我看来,拥有一个数组,每个工作者访问由数组索引指定的变量更合理,因为不会发生冲突,尽管读取和写入同一个数组也可能有问题。)

有人可以详细说明这件事吗?谢谢!

1 个答案:

答案 0 :(得分:1)

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

  1. 切片输出,由循环变量
  2. 索引
  3. 减少输出,使用公认的减少
  4. 形成

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

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

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