Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations strongm on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Why is Fortran slower than Octave?

Status
Not open for further replies.

evansste

Programmer
Sep 25, 2019
1
US
Normally, Fortran is leaps and bounds faster than Octave. However, I've noticed that when performing similar matrix manipulations with Fortran's "spread" function, compared to Octave's "repmat" function, Octave runs about twice as fast as my compiled fortran version of the program. Is anyone able to give an explanation as to why that is? Is there something that I need to be doing in order to increase Fortran's performance?

First, here's my simple fortran program:

Code:
program block
    double precision, parameter, dimension(1000,500) :: A = reshape([ ... ],[1000,500])
    double precision, dimension(:,:,:), allocatable :: blockL
    integer, dimension(2) :: Adim

    Adim = shape(A)
    blockL = spread(A,3,Adim(1))==spread(transpose(A),1,Adim(1))

end program block

Now here's my corresponding program, written in Octave:

Code:
A = [ ... ];  % This is the same "A" that was used in Fortran
Adim1 = size(A,1);
blockL = repmat(A,[1 1 Adim1])==repmat(permute(A,[3 2 1]),[Adim1 1 1]);

Once compiled, the Fortran program takes about fifteen seconds to run. The Octave program takes about eight. Shouldn't a compiled program always be faster than an interpreted one? Any ideas on what I may be doing wrong, or how I could speed up my Fortran program?

Thanks so much for your time and attention. I appreciate any guidance that anyone is able, or willing, to provide.

 
Fortran may be faster than many packages but tools like Ocatave (or Matlab) are optimized for matrix operations - hence the name matlab. The operations like repmat, permute and == may be efficient within themselves but not when use together.

Instead of a one liner, you could split up the individual operations to see which one actually took the longest.

At a guess, octave splits up the expression into primitives, optimizes it and then executes. In Fortran, unless you are using a highly optimized compiler, each function will be executed separately.

Edit: Just checked - repmat is not a standard function. The fortran equivalent is called spread. Possibly look into the implementation of repmat if it is a local function.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top