Dear bug-gcc Group,

This concerns gcc (gfortran) 14.2.1 on an x86_64 Red Hat Linux system. I am 
using the ieee_next_after function from the (intrinsic) ieee_arithmetic module 
in an inner loop and I noticed that it takes very much CPU time. It seems 
unreasonable to me and so I am reporting it as a bug.

The following test program provides a timing comparison between two simple 
nested loops. In the first instance the inner loop contains a multiply 
operation and in the second instance the inner loop invokes ieee_next_after. I 
use the Fortran intrinsic cpu_time for timing. There is a slight bit of baggage 
in the code (a call to random_number()) just to make sure that an optimizing 
compiler can not optimize away big parts of the calculation.

The output (using an Intel i7-1165G7 processor and compiling with `gfortran 
-O5`) shows a time of 0.09 seconds for the calculation that contains the 
multiplication in the inner loop and a time of 20.7 seconds for the calculation 
that invokes ieee_next_after. It tells me that the cost of ieee_next_after is 
at least about 200 multiplication operations.

program main
  !..use and access
  use iso_fortran_env, only : wp => real64
  use ieee_arithmetic
  implicit none
  !..data
  integer, parameter :: m=10000, n=10000
  integer :: i, j
  real (kind=wp) :: tim0, tim1, t0, r
  !..executable part
  r = 0
  call cpu_time (tim0)
  do i = 0, m-1
     call random_number (t0)
     do j = 0, n-1
        t0 = t0*(1-epsilon(t0))
        r = r+t0
     end do
  end do
  call cpu_time (tim1)
  write (*,*) 'simple arithmetic:', tim1-tim0, r
  r = 0
  call cpu_time (tim0)
  do i = 0, m-1
     call random_number (t0)
     do j = 0, n-1
        t0 = ieee_next_after(t0,0.0_wp)
        r = r+t0
     end do
  end do
  call cpu_time (tim1)
  write (*,*) 'ieee_next_after:', tim1-tim0, r
  stop
end program main

Cordially,
Bas Braams
https://www.cwi.nl/en/people/bastiaan-braams/

Reply via email to