Hi all,

I'm working on a Fortran77 code, but I'd much prefer to translate it to 
Julia.  However, I've the impression that when working with large arrays 
(of the order of tens of thousands elements) Julia is way slower than the 
equivalent Fortran code.  See the following examples:

Julia:

function foo()
    array1 = rand(70, 1000)
    array2 = rand(70, 1000)
    array3 = rand(2, 70, 20, 20)
    bar = 0
    @time for l = 1:1000, k = 1:20, j = 1:20, i = 1:70
        bar = bar +
            (array1[i, l] - array3[1, i, j, k])^2 +
            (array2[i, l] - array3[2, i, j, k])^2
    end
end
foo()

Fortran77 (it uses some GNU extensions, so gfortran is required):

      program main
      implicit none
      double precision array1(70, 1000), array2(70, 1000),
     &    array3(2, 70, 20, 20), bar, start, finish
      integer i, j, k, l
      call srand(time())
c     Initialize "array1" and "array2"
      do j = 1, 1000
        do i = 1, 70
          array1(i, j) = rand()
          array2(i, j) = rand()
        enddo
      enddo
c     Initialize "array3"
      do l = 1, 2
        do k = 1, 70
          do j = 1, 20
            do i = 1, 20
              array3(i, j, k, l) = rand()
            enddo
          enddo
        enddo
      enddo
c     Do the calculations
      bar = 0
      call cpu_time(start)
      do l = 1, 1000
        do k = 1, 20
          do j = 1, 20
            do i = 1, 70
              bar = bar +
     &            (array1(i, l) - array3(1, i, j, k))**2 +
     &            (array2(i, l) - array3(2, i, j, k))**2
            enddo
          enddo
        enddo
      enddo
      call cpu_time(finish)
      print "(f10.6, a)", finish - start, " seconds"
      end program main

This is the result of running the two programs on my computer:

% julia --version
julia version 0.4.5
% gfortran --version
GNU Fortran (Debian 5.3.1-20) 5.3.1 20160519
Copyright (C) 2015 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING

% julia -f test.jl
  1.099910 seconds (84.00 M allocations: 1.252 GB, 7.14% gc time)
% gfortran test.f&&./a.out
  0.132000 seconds

While Julia code is 3 times shorter than the Fortran77 code (and this one 
of the many reasons why I like Julia very much), it's also more than 8 
times slower and my build of Julia 0.5 (updated to aa1ce87) performs even 
worse, it takes about 1.4 seconds.  If I remove access to the arrays (just 
put "bar = bar" as loop body) then Julia is infinitely faster than Fortran 
in the sense that Julia takes 0.000000 seconds, Fortran 0.056000.

Is this difference to be expected or are there tricks to fasten the Julia 
code?  I should have gotten the order of nested loops right.  @inbounds 
doesn't help that much.  Parallelization is probably not an option because 
the code above is a small part of a larger loop that does data movement 
(can DistributedArrays help?).

Bye,
Mosè

Reply via email to