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