【发布时间】:2016-03-07 11:03:27
【问题描述】:
我用 Fortran 和 Matlab 编写了完全相同的代码。该代码可以在两种语言中连续运行,但在 Fortran 中速度要快得多。
代码的循环之一可以并行化。在 Matlab 中,我只需将for 替换为parfor 即可轻松实现这一点。
Fortran 有这么简单的吗?我正在使用 Intel Fortran 编译代码。
这是我正在做的一个非常简单的例子:
Matlab 代码:
clear;
tic
gamma=5;
beta=0.95;
T=5;
r=0.015;
maxw = 50;
minw = 1;
nw = 50;
nc = 50;
gw = linspace(minw,maxw,nw)';
gc = linspace(0.0,maxw,nc)';
c = zeros(nw,T);
v = zeros(nw,T);
c(:,T)=gw(:,1);
v(:,T) = (c(:,T).^(1-gamma))/(1-gamma);
for i=T-1:-1:1,
i
aux = v(:,i+1);
parfor z=1:nw,
auxV=zeros(nc,1);
for j=1:nc,
sav = gw(z,1)-gc(j,1);
w_t1 = (1+r)*sav;
w_t1 = max(min(w_t1,maxw),minw);
auxV(j,1)=(gc(j,1)^(1-gamma))/(1-gamma)+beta*interpn(gw,aux,w_t1);
end
[v(z,i) imax]= max(auxV);
c(z,i)=gc(imax,1);
end
end
toc
有了parfor,语法计算时间显着减少。
等价的fortran代码是:
PROGRAM toy
IMPLICIT NONE
REAL :: gamma=5;
REAL :: beta=0.95;
INTEGER :: T=5;
REAL :: r=0.015;
REAL :: maxw = 50;
REAL :: minw = 1;
INTEGER :: nw = 50;
REAL, DIMENSION(1,50) :: gw, gc, aux3
REAL, DIMENSION(50,1) :: secd
INTEGER :: ind1, ind2, ind3
INTEGER :: nc = 50;
REAL, DIMENSION(50,5) :: c, v
REAL, DIMENSION(50,1) :: aux, auxV
REAL :: sav, w_t1
INTEGER, DIMENSION(1,1) :: pt
REAL :: aux1
c = 0;
v = 0;
DO ind1=1,nw
gw(1,ind1)=1.0+(ind1-1.0)*1.0
END DO
DO ind1=1,nc
gc(1,ind1)=0.0+(ind1-1.0)*1.0
END DO
aux3(1,:) = gw(1,:)
c(:,T)=gw(1,:);
v(:,T) = (c(:,T)**(1-gamma))/(1-gamma);
do ind1=T-1,1,-1
secd(:,1) = 0.0
call spline(aux3,v(:,ind1+1),nw,gamma,secd(:,1))
aux(:,1) = v(:,ind1+1)
do ind3=1,nw
auxV=0;
do ind2=1,nc
sav = gw(1,ind3)-gc(1,ind2);
w_t1 = (1+r)*sav;
w_t1 = max(min(w_t1,maxw),minw)
call splint(aux3,v(:,ind1+1),secd(:,1),nw,w_t1,1,1,aux1)
auxV(ind2,1)=(gc(1,ind2)**(1-gamma))/(1-gamma)+beta*aux1
end do
v(ind3,ind1) = maxval(auxV)
pt(1,1) = sum(maxloc(auxV))
c(ind3,ind1)=gc(1,pt(1,1))
end do
end do
end program
是否有任何简单的方法可以像 matlab 一样并行化第二个嵌套循环?
【问题讨论】:
-
为什么拥有 MATLAB 代码很重要?请尽量将您的问题限制在相关信息范围内。
-
您必须发布代码。如果它很大,请发布相关部分。如果您担心某个特定循环,请发布该循环。另外,您是否尝试过阅读或搜索有关 Fortran 中并行处理的任何内容? Stack Overflow 上有大量相关资源。
-
Fortram 是比 MATLAB 低级的编程范式,这意味着好的 Fortram 代码很可能总是比 MATLAB 快,但也很可能总是更难编写。
-
@VladimirF,刚刚用一些代码更新了问题。