The Computer Language
24.11 Benchmarks Game

fannkuch-redux Intel Fortran program

source code

! The Computer Language Benchmarks Game
! https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
!
! converted to fortran by Gilbert Brietzke on 31. Januar 2011
! from C-code by Joseph Piché as a conversion
! from Java version by Oleg Mazurov and Isaac Gouy

program fannkuch

  implicit none

  integer :: n,checksum,maxFlipsCount
  character(len=2) :: arg
  character(len=10) :: out
  call get_command_argument(1,arg);read(arg,'(I2)')n
  call fannkuchredux(n,checksum,maxFlipsCount)
  write(out,'(I10)') checksum;
  write(*,'(A)') trim(adjustl(out))
  write(out,'(I10)') maxFlipsCount;
  write(*,'(A)') 'Pfannkuchen('//trim(adjustl(arg))//') = '//trim(adjustl(out))

contains

  subroutine fannkuchredux(n,checksum,maxFlipsCount)
    implicit none
    integer, intent(in) :: n
    integer, intent(out) :: maxFlipsCount,checksum
    integer :: perm(0:n-1),perm1(0:n-1),icount(0:n-1);
    integer :: i,r,temp,k,perm0,permCount = 0,flipsCount = 0;
    checksum = 0;  maxFlipsCount = 0;
    do i = 0,n-1
       perm1(i)= i;
    enddo
    r=n
    do while (.true.)
       do while (r /= 1)
          icount(r-1)=r; r=r-1;
       end do
       perm = perm1; flipsCount = 0;
       do while (perm(0)/=0) 
          k = perm(0)
          do  i=0,ishft(k+1,-1)-1
             temp = perm(i); perm(i) = perm(k-i); perm(k-i) = temp;
          enddo
          flipsCount = flipsCount + 1;
       end do
       maxFlipsCount = max(maxFlipsCount,flipsCount);
       if (modulo(permCount,2) == 0)then
          checksum = checksum + flipsCount
       else
          checksum = checksum - flipsCount
       end if
       do while (.true.)
          if (r==n) return
          perm0 = perm1(0); i = 0;
          do while (i < r) 
             perm1(i) = perm1(i + 1); i = i + 1;
          end do
          perm1(r) = perm0;
          icount(r) = icount(r) - 1;
          if (icount(r) > 0) exit;
          r = r + 1;
       end do
       permCount = permCount + 1;
    end do
  end subroutine fannkuchredux
  
end program fannkuch
    

notes, command-line, and program output

NOTES:
64-bit Ubuntu quad core
ifx (IFX)
2024.1.0 20240308


 Mon, 03 Jun 2024 20:33:33 GMT

MAKE:
mv fannkuchredux.ifx fannkuchredux.f90
~/intel/oneapi/compiler/latest/bin/ifx -O3 -march=ivybridge -ipo -static -qopenmp fannkuchredux.f90 -o fannkuchredux.ifx_run
ld: /home/dunham/intel/oneapi/compiler/2024.1/lib/libifcoremt.a(for_close_proc.o): in function `for__close_proc':
for_close_proc.c:(.text+0x1df): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
rm fannkuchredux.f90

4.26s to complete and log all make actions

COMMAND LINE:
 ./fannkuchredux.ifx_run 12

PROGRAM OUTPUT:
3968050
Pfannkuchen(12) = 65