Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

bug with copying a large array

kay-diederichs
New Contributor I
325 Views

Hi,

I found a problem with ifort 18.0.3 on a x86_64 machine.  This code

PROGRAM bug
  IMPLICIT NONE
  INTEGER(SELECTED_INT_KIND(9)) :: i
  INTEGER(SELECTED_INT_KIND(18)) :: nobs,k8=10000000,i8
  INTEGER, ALLOCATABLE :: obs(:),temp_obs(:)
  
  ALLOCATE(obs(10000000))
  nobs=0
  DO i8=1,INT(HUGE(i),KIND=8)*2 - 1000000
    i=1   ! replacement for READ(...)i
    nobs=nobs+1
    IF (nobs==k8) THEN
      k8=2*k8
    END IF
    IF (nobs>SIZE(obs,KIND=8)) THEN   
      ALLOCATE(temp_obs(2*SIZE(obs,KIND=8)))
      temp_obs(:SIZE(obs,KIND=8))=obs  ! temp_obs(1:SIZE ... fixes this!
      PRINT*,temp_obs(1),nobs
      CALL MOVE_ALLOC(temp_obs,obs)
      PRINT*,obs(1),nobs
      IF (obs(1) /= 1) STOP 'this is wrong'
    END IF
    obs(nobs)=i
  END DO
  STOP 'finished without error'
END PROGRAM bug

shows that the

temp_obs(:SIZE(obs,KIND=8))=obs 

line does not work right - it seems to zero the temp_obs array, instead of copying the obs array.

The bug is not triggered if the line is replaced by

temp_obs(1:SIZE(obs,KIND=8))=obs 

The bug is not present in gfortran.

Warning: you need a machine with enough RAM - 24 GB is enough; maybe 16GB suffices.

Thanks,

Kay

 

 

0 Kudos
0 Replies
Reply