Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并行化Fortran与并行化Matlab_Matlab_Fortran - Fatal编程技术网

并行化Fortran与并行化Matlab

并行化Fortran与并行化Matlab,matlab,fortran,Matlab,Fortran,我用Fortran和Matlab编写了完全相同的代码。这段代码在两种语言中都可以串行运行,但在Fortran中运行速度要快得多。 代码的一个循环可以并行化。在Matlab中,我只需将for替换为parfor即可轻松实现这一点 在Fortran语言中有这样简单的语言吗?我正在使用英特尔Fortran编译代码 下面是我正在做的一个非常简单的例子: Matlab代码: clear; tic gamma=5; beta=0.95; T=5; r=0.015; maxw = 50; minw =

我用Fortran和Matlab编写了完全相同的代码。这段代码在两种语言中都可以串行运行,但在Fortran中运行速度要快得多。 代码的一个循环可以并行化。在Matlab中,我只需将
for
替换为
parfor
即可轻松实现这一点

在Fortran语言中有这样简单的语言吗?我正在使用英特尔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。这类似于MatlabParfor,但不太容易使用。建议您尝试OpenMP,它将为您提供与parfor类似的速度提升。OpenMP有很好的文档记录,而且非常可靠。

大多数当前的Fortran编译器都支持OpenMP。这类似于MatlabParfor,但不太容易使用。建议您尝试OpenMP,它将为您提供与parfor类似的速度提升。OpenMP有很好的文档记录,而且非常可靠

ifort toy.f90 -parallel
也许不如coarray或其他选项那么好,但是尝试一下,超级容易实现


也许不如coarray或其他选项那么好,但是尝试一下,超级容易实现

为什么有MATLAB代码是相关的?请尽量将您的问题限制在相关信息上。您必须发布代码。如果是巨大的,张贴相关部分。如果您关心某个特定循环,请发布该循环。另外,您是否尝试过阅读或搜索Fortran中有关并行处理的内容?关于堆栈溢出,有大量的资源。Fortram是比MATLAB更低级别的编程范例,这意味着好的Fortram代码很可能总是比MATLAB快,但也很可能总是更难编写。@VladimirF,刚刚用一些代码更新了这个问题。为什么你有MATLAB代码?请尽量将您的问题限制在相关信息上。您必须发布代码。如果是巨大的,张贴相关部分。如果您关心某个特定循环,请发布该循环。另外,您是否尝试过阅读或搜索Fortran中有关并行处理的内容?关于堆栈溢出,有大量的资源。Fortram是一种比MATLAB更低级别的编程范例,这意味着好的Fortram代码很可能总是比MATLAB快,但也很可能总是更难编写。@VladimirF,刚刚用一些代码更新了这个问题。嗨,谢谢你的回答。我在visualstudio的Fortran命令行上添加了这一点,但我得到了以下两个错误:警告1命令行警告#10161:无法识别的源类型“ifort”;对象文件假定ifort Warning 2命令行警告#10006:忽略未知选项“/parallel”ifort@volcompt你不想在那里添加ifort,它已经在那里了,那就是编译器!Windows版本的
并行
/Qparallel
。谢谢。仍然会出现错误:“ifort:命令行警告#10006:忽略未知选项'/Qparallel.'”对不起,我的是Linux,这对我来说很有用。试试这个,我想我找到了。现在我遇到了这个错误:“警告#10182:禁用优化;启用运行时调试检查”如何在Visual Studio上禁用运行时调试检查?您好,谢谢您的回答。我在visualstudio的Fortran命令行上添加了这一点,但我得到了以下两个错误:警告1命令行警告#10161:无法识别的源类型“ifort”;对象文件假定ifort Warning 2命令行警告#10006:忽略未知选项“/parallel”ifort@volcompt你不想在那里添加ifort,它已经在那里了,那就是编译器!Windows版本的
并行
/Qparallel
。谢谢。仍然会出现错误:“ifort:命令行警告#10006:忽略未知选项'/Qparallel.'”对不起,我的是Linux,这对我来说很有用。试试这个,我想我找到了。现在我遇到了这个错误:“警告#10182:禁用优化;启用运行时调试检查”如何在Visual Studio上禁用运行时调试检查?