我有一个parfor
循环遍历i = 1:250
,根据索引从数组中获取三个值。然后使用这3个值在parfor
循环内进行计算。然后,我将结果存储在变量theta1
,theta2
和theta3
中,并立即将它们打印到文件中。我正在并行化,因为计算花费了太多时间,并且对于每个索引,它们可以独立完成。我想MATLAB
不一定会通过让工人计算独立迭代来划分工作,但它可以在工人之间划分给定的迭代。在任何一种情况下,对变量的值赋值或对文件的打印是否会受到操作完成顺序的影响?是否有可能以不同的顺序打印结果,如:
theta1 from i = 1
theta1 from i = 2
theta2 from i = 2
theta3 from i = 2
theta2 from i = 1
...
而不是所需的顺序,即:
theta1 from i = 1
theta2 from i = 1
theta3 from i = 1
theta1 from i = 2
theta2 from i = 2
...
在单元格数组中收集所有结果然后在最后打印它们会更健康吗?
答案 0 :(得分:2)
拥有外部parfor循环意味着函数所查看的i
的值不能保证为1,2,3等。但theta1
,theta2
, theta3
变量INSIDE parfor循环将按其内部parfor循环内的顺序计算。因此,唯一能保证的是,对于给定的i
值,theta1
将首先完成,然后theta2
,然后theta3
。工作者本身(i
循环)是交错的,因此完全有可能得到结果
theta1 from i = 1
theta1 from i = 2
theta2 from i = 2
theta3 from i = 2
theta2 from i = 1
...
在任何情况下,打印到parfor循环内的文件都会导致问题,因为可能是两个工作者正在尝试同时写入文件。这意味着你将失去"一些计算的结果。 MATLAB方式(如果存在这样的事情......)可以更好地保存数组或单元阵列中parfor循环的所有结果(常规数组更适合内存原因,因为不需要整个单元阵列在所有parfor循环中共享;但是单元格数组更容易包围原型并在最后将其打印到文件中。