我有一个脚本可以解决for循环中许多参数的微分方程组。 (迭代完全独立,但在每次迭代结束时,根据计算结果修改大矩阵(mat))。这是代码:(B是包含参数的矩阵)
mat=zeros(20000,1);
for n=1:20000
prop=B(n,:); % B is a (20000 * 2 ) matrix that contains U and V parameters
U=prop(1);
V=prop(2);
options=odeset('RelTol',1e-6,'AbsTol',1e-20);
[T,X]=ode45(@acceleration,tspan,x0,options);
rad=X(:,1);
if max(rad)<radius % radius is a constant
mat(n)=1;
end
function xprime=acceleration(T,X)
.
.
.
end
首先我尝试使用parfor,但因为加速函数(ode45输入)被定义为内联函数,(为了获得更好的性能)我不能这样做。
我可以打开4个MATLAB会话(我的CPU有4个内核)并在每个会话中单独运行代码,而不是修改代码以实现加速作为单独的功能,因此,使用parfor?它是否能够在一次会话中提供4倍的运行性能? (或者它是否提供与并行化代码相同的性能? - 在并行代码中我无法定义内联函数 - ) (在Windows上)
答案 0 :(得分:1)
如果您已准备好将分离出来的问题分别在4个会话中单独运行,那么请重新组合结果,确保您可以这样做。根据我的经验(在Windows上)它实际上运行得更快,在四个单独的会话中运行代码而不是具有4个工作人员的parfor循环。不如单个会话的4倍性能快,因为操作系统还有其他工作要做......例如,如果你没有其他处理器繁重的应用程序在运行,那么操作系统本身可能会占用一个核心的25% ,单个会话的性能可能是3.75倍。但是,这假设您有足够的内存,而不是限制因素。
如果您想定期执行此操作,则可能需要创建一些基于文件的信令/数据传递系统。
这显然不如parfor
那么优雅,但可以适用于您的情况,或者如果您无法承担并行工具箱的许可费用。