我有一个3维网格,其中对于网格的每个点,我想计算大量时间步长的时间相关函数G(t),然后对每个网格点求G函数.使用4 for循环,执行时间变得非常大,所以我试图使用parfor来避免这种情况.
我的代码的一部分:
for i=1:50
for j=1:50
for k=1:25
x_in=i*dx;
y_in=j*dy;
z_in=k*dz;
%dx,dy, dz are some fixed values
r=sqrt((xx-x_in).^2+(yy-y_in).^2+(zz-z_in).^2);
%xx,yy,zz are 50x50x25 matrices generated from meshgrid
% r is a 3d matrix which produced from a 3 for-loop, for all the points of grid
parfor q=1:100
t=0.5*q;
G(q)=((a*p)/(t.^1.5)).*(exp(-r.^2/(4*a*t)));
% a,p are some fixed values
end
GG(i,j,k)=sum(G(:));
end
end
end
Run Code Online (Sandbox Code Playgroud)
当我使用时parfor,执行时间变得更大,我不确定为什么会这样.也许我对parfor循环中的切片和索引变量不太熟悉.
我的电脑处理器有8个线程和ram内存ddr3 8GB
任何帮助都会很棒.
谢谢
正如前一个问题中所讨论的,parfor带来了开销.因此,太简单的循环将执行得更慢parfor.
在您的情况下,解决方案可能是并行化最外层的循环.
%# preassign GG
GG = zeros(50,50,25);
%# loop over indices into GG
parfor idx = 1:(50*50*25)
[i,j,k] = ind2sub([50 50 25],idx);
x_in=i*dx;
y_in=j*dy;
z_in=k*dz;
%dx,dy, dz are some fixed values
r=sqrt((xx-x_in).^2+(yy-y_in).^2+(zz-z_in).^2);
%xx,yy,zz are 50x50x25 matrices generated from meshgrid
% r is a 3d matrix which produced from a 3 for-loop, for all the points of grid
for q=1:100
t=0.5*q;
G(q)=((a*p)/(t.^1.5)).*(exp(-r.^2/(4*a*t)));
% a,p are some fixed values
end
GG(idx)=sum(G(:));
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
611 次 |
| 最近记录: |