Parfor 循环中的临时变量问题及解决方案
Parfor 循环中的临时变量问题是由于并行计算时每个工作进程都有自己的内存空间,因此无法共享临时变量。这可能会导致结果不一致或错误的结果。解决这个问题的方法有以下几种:
- 避免使用临时变量。尽可能使用已经存在的变量或向函数传递参数来避免使用临时变量。
- 使用 'spmd' 语句。'spmd' 语句可以在并行计算中创建共享变量,从而避免临时变量问题。
- 使用 parfor 循环中的工作空间。可以使用 parfor 循环中的工作空间来存储临时变量,这样每个工作进程都可以访问相同的变量。
- 使用 'matlab.io.saveVariablesToScript' 函数。可以使用该函数将临时变量保存到脚本文件中,然后在 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 中找到最大目标函数值对应的下标,返回最优解和对应的目标函数值。
原文地址: https://www.cveoy.top/t/topic/jG3b 著作权归作者所有。请勿转载和采集!