Matlab 并行计算:Parfor 循环中的临时变量问题及解决方法

Parfor 循环是 Matlab 中用于进行并行计算的重要工具,但在使用 Parfor 循环时,可能会遇到临时变量问题。这是因为每个工作进程都有自己的内存空间,无法直接共享临时变量。这会导致结果不一致或错误的结果。

常见的临时变量问题

例如,以下代码使用 Parfor 循环进行随机搜索,并尝试记录最优解和对应的目标函数值:

for i=1:n
  p0=0
  x=randi([0,99],1,5); %产生一行五列的区间[0,99]上的随机整数
  [f,g]=fun(x);
  if all(g<=0)
    if p0(i)<f
      x0=x;
      p0(i+1)=f;%记录下当前较好的解和对应的最大目标函数值
    end
  end
end
x0, p0, toc %计时结束

这段代码的作用是进行一次随机搜索(random search)。具体操作为:

  1. 循环执行 n 次,每次生成一个随机解 x 并计算其目标函数值 f 和不等式约束 g。
  2. 判断当前解 x 是否满足所有的约束条件 g<=0,如果满足则记录下当前较好的解 x0 和对应的最大目标函数值 p0。
  3. 最后返回最优解 x0 和对应的目标函数值 p0,并输出程序执行时间。

需要注意的是,在循环中,每个 p0 都被初始化为 0。因此,只有当找到第一个满足所有约束条件的解时,才能更新 p0 的值。

如何修改成并行计算

可以使用 Parfor 循环来实现并行计算,将循环体中的代码放入 Parfor 循环中即可。需要注意的是,在 Parfor 循环中,每个工作进程都有自己的 p0 变量,因此需要使用共享变量来存储最优解和对应的目标函数值。具体修改如下:

parfor i=1:n
  p0_local=0; %每个工作进程都有自己的 p0 变量
  x=randi([0,99],1,5);
  [f,g]=fun(x);
  if all(g<=0)
    if p0_local<f %使用本地变量
      x0_local=x;
      p0_local=f;
    end
  end
  p0(i)=p0_local; %将最优解和对应的目标函数值保存到共享变量中
  x0{i}=x0_local;
end
[~,idx]=max(p0); %找到最大目标函数值对应的下标
x0=x0{idx}; %返回最优解
p0=p0(idx); %返回最大目标函数值
toc %计时结束

在 Parfor 循环中,用 p0_local 代替 p0,并将最优解和对应的目标函数值保存到共享变量 p0 中。最后,在共享变量 p0 中找到最大目标函数值对应的下标,返回最优解和对应的目标函数值。

解决临时变量问题的其他方法

除了 Parfor 循环和 spmd 语句,还可以使用 matlab.pool.Constant 来定义常量,从而避免临时变量问题。具体操作为:

  1. 定义常量。使用 matlab.pool.Constant 函数定义常量,例如:
c=matlab.pool.Constant(1);
  1. 在 Parfor 循环中使用常量。在 Parfor 循环中,使用 c.Value 来访问常量的值,例如:
p0=c.Value;

这样可以避免每个工作进程都创建自己的常量。

总结

Parfor 循环是 Matlab 中进行并行计算的强大工具,但需要注意临时变量问题。通过避免使用临时变量、使用 spmd 语句、使用 Parfor 循环的工作空间、使用 matlab.io.saveVariablesToScript 函数或使用 matlab.pool.Constant 定义常量,可以有效解决临时变量问题,提高并行计算的效率和准确性。

Matlab 并行计算:Parfor 循环中的临时变量问题及解决方法

原文地址: https://www.cveoy.top/t/topic/jG3k 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录