Matlab 并行计算:Parfor 循环中的临时变量问题及解决方法
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)。具体操作为:
- 循环执行 n 次,每次生成一个随机解 x 并计算其目标函数值 f 和不等式约束 g。
- 判断当前解 x 是否满足所有的约束条件 g<=0,如果满足则记录下当前较好的解 x0 和对应的最大目标函数值 p0。
- 最后返回最优解 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 来定义常量,从而避免临时变量问题。具体操作为:
- 定义常量。使用
matlab.pool.Constant函数定义常量,例如:
c=matlab.pool.Constant(1);
- 在 Parfor 循环中使用常量。在 Parfor 循环中,使用
c.Value来访问常量的值,例如:
p0=c.Value;
这样可以避免每个工作进程都创建自己的常量。
总结
Parfor 循环是 Matlab 中进行并行计算的强大工具,但需要注意临时变量问题。通过避免使用临时变量、使用 spmd 语句、使用 Parfor 循环的工作空间、使用 matlab.io.saveVariablesToScript 函数或使用 matlab.pool.Constant 定义常量,可以有效解决临时变量问题,提高并行计算的效率和准确性。
原文地址: https://www.cveoy.top/t/topic/jG3k 著作权归作者所有。请勿转载和采集!