簡體   English   中英

Parallelize Fortran與Parallelize Matlab

[英]Parallelize Fortran vs Parallelize Matlab

我有用Fortran和Matlab編寫的完全相同的代碼。 該代碼可以兩種語言順序運行,但在Fortran中則要快得多。 代碼的循環之一可以並行化。 在Matlab中,我只需用parfor替換for輕松實現這一點。

在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一樣並行化第二個嵌套循環?

當前大多數Fortran編譯器都支持OpenMP。 這類似於Matlab Parfor,但使用起來並不那么容易。 建議您嘗試使用OpenMP,它應該為您提供與parfor相似的速度增加。 OpenMP有據可查且非常可靠。

ifort toy.f90 -parallel

也許不像其他選項(例如,coarrays或其他選項)那么好,但是嘗試一下,超級容易實現!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM