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
支持两种类型的循环输出:
- sliced 由循环变量索引的输出
- reduction 使用公认的 reduction
形成的输出
在您的情况下,单独使用 a
将是缩减输出,因为它以正确的形式更新。串联也是一种有效的归约形式——但不幸的是,求和和串联的组合不是有效的归约。基本上,您在这里要实现的是 MATLAB 的 cumsum
,而这不是关联的(这是减少 parfor
的要求)。
在这种情况下,我要做的只是发出值向量,然后在 MATLAB 客户端执行 cumsum
。例如
parfor i = 1:10
a(i) = i;
end
realDataIneed = cumsum(a);
我现在正在为 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
支持两种类型的循环输出:
- sliced 由循环变量索引的输出
- reduction 使用公认的 reduction 形成的输出
在您的情况下,单独使用 a
将是缩减输出,因为它以正确的形式更新。串联也是一种有效的归约形式——但不幸的是,求和和串联的组合不是有效的归约。基本上,您在这里要实现的是 MATLAB 的 cumsum
,而这不是关联的(这是减少 parfor
的要求)。
在这种情况下,我要做的只是发出值向量,然后在 MATLAB 客户端执行 cumsum
。例如
parfor i = 1:10
a(i) = i;
end
realDataIneed = cumsum(a);