- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am using Fortran Compiler 17.0.2.187.
I think I have come across a bug in the compiler. The following test program writes out data to an unformatted file. It then reads it back in, and compares with the original data to make sure the IO was done correctly. If I use the default options, the test passes. However, if I enable buffering with /assume:buffered_io , the test fails.
Roman
module unformattedIO_mod
integer,parameter,private:: mcell=150000
integer(kind=8),allocatable,private:: wtz(:), gdiag(:)
integer(kind=8),allocatable,private:: wtz2(:), gdiag2(:)
character(len=*),parameter:: testfilename='testIO.dat'
contains
!---------------------------------------------------------------------------------
subroutine writefile()
implicit none
integer i
allocate(wtz(mcell), gdiag(mcell) )
do i = 1, mcell
wtz(i) = i
gdiag(i) = 100 * i
end do
open(unit=8, file=testfilename, form='unformatted', action='write')
write(8) wtz
write(8) gdiag
close(8)
return
end subroutine writefile
!----------------------------------------------------------------
subroutine readfile()
implicit none
allocate(wtz2(mcell), gdiag2(mcell) )
open(unit=9, file=testfilename, form='unformatted', action='read')
read(9) wtz2
read(9) gdiag2
close(9)
if ( all(gdiag == gdiag2) .and. all(wtz == wtz2) ) then
write(*,*) 'Test passed.'
else
write(*,*) 'Test failed.'
end if
return
end subroutine readfile
end module unformattedIO_mod
!=============================================================
program testUnformattedIO
use unformattedIO_mod, only: writefile, readfile
implicit none
call writefile()
call readfile()
stop
end program testUnformattedIO
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This appears to be a regression with the 17.0.2 compiler. The failure does not occur with the 17.0.1 (or earlier) compiler. If you have 17.0.1 available you could use that as a work around, or as you noted do not use buffered I/O, or with buffered I/O the failure is avoidable (at least for the test case provided) by setting the blocksize to 1200000 via the environment variable FORT_BLOCKSIZE.
Thank you for the convenient reproducer. I escalated this to Development.
(Internal tracking id: DPD200419523)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Replicating this comment to ensure you receive it Roman - This is possibly the same as my problem, as I use the buffered I/O option by default. But, the problem I identify also arises when buffered I/O is suppressed - as indicated by the VERSION2.zip that is included in my post
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The original issue reported in this thread is fixed in the upcoming 18.0 compiler.
Thank you,
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I think I just spent a week or so rediscovering this bug in 2017 FORTRAN Update 4.
Devorah - can you verify the below example runs to completion using the new 18.0 compiler when compiled with the buffered IO optimization?
When I test with 2017 FORTRAN Update 4 and the buffered IO optimization it crashes while reading in the file it writes.
program main
IMPLICIT NONE
integer :: scencqs = 53
integer, pointer :: myreg(:), myk(:), myi(:), myj(:)
real, pointer :: cq(:,:)
real, pointer :: cvol(:), crhot(:)
real, pointer :: cdt(:), ped(:), ued(:), ged(:), bed(:), sob(:)
real, pointer :: pgd(:), pxd(:), ppd(:), pud(:)
integer*4 :: lun,ic
integer :: nctot = 0
integer, pointer :: wmyreg(:), wmyk(:), wmyi(:), wmyj(:)
real, pointer :: wcq(:,:)
real, pointer :: wcvol(:), wcrhot(:)
real, pointer :: wcdt(:), wped(:), wued(:),
& wged(:), wbed(:), wsob(:)
real, pointer :: wpgd(:), wpxd(:), wppd(:), wpud(:)
integer*4 :: luno,wic
integer :: wnctot
print *, "Writing file..."
luno=10
open(unit=luno,form='unformatted',
&file='test.input')
wnctot=71445
allocate(wmyreg(wnctot),wmyk(wnctot),wmyi(wnctot),wmyj(wnctot),
& wcq(scencqs,wnctot),wcvol(wnctot),wcrhot(wnctot),
& wcdt(wnctot),wged(wnctot),wbed(wnctot),
& wsob(wnctot),wped(wnctot),wued(wnctot))
allocate(wpgd(wnctot),wpxd(wnctot),
& wppd(wnctot),wpud(wnctot))
write(luno) (wmyreg(wic),wmyk(wic),wmyi(wic),wmyj(wic),
& wic=1,wnctot)
write(luno) (wcq(1:scencqs,wic),wic=1,wnctot)
write(luno) (wcvol(wic),wcrhot(wic),wcdt(wic),wged(wic),
& wbed(wic),wsob(wic),wped(wic),wued(wic),wic=1,wnctot)
write(luno) (wpgd(wic),wpxd(wic),wppd(wic),wpud(wic),
& wic=1,wnctot)
call flush(luno)
close(luno)
print *, "Reading file..."
lun = 10
open(unit=luno,form='unformatted',
&file='test.input')
nctot=71445
allocate(myreg(nctot),myk(nctot),myi(nctot),myj(nctot),
& cq(scencqs,nctot),cvol(nctot),crhot(nctot),
& cdt(nctot),ged(nctot),bed(nctot),
& sob(nctot),ped(nctot),ued(nctot))
allocate(pgd(nctot),pxd(nctot),
& ppd(nctot),pud(nctot))
read(lun) (myreg(ic),myk(ic),myi(ic),myj(ic),ic=1,nctot)
read(lun) (cq(1:scencqs,ic),ic=1,nctot)
read(lun) (cvol(ic),crhot(ic),cdt(ic),ged(ic),
& bed(ic),sob(ic),ped(ic),ued(ic),ic=1,nctot)
read(lun) (pgd(ic),pxd(ic),ppd(ic),
& pud(ic),ic=1,nctot)
write(*,*) "Finished"
close(lun)
end program main
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The code in #5 does not follow either the fixed form or the free form of Fortran source. The compiler refuses to accept this nonstandard source form.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi James,
Yes it builds and runs in 18.0
$ ifort -v
ifort version 18.0.0
$ ifort -g -traceback -assume buffered_io test2.f90
$ ./a.out
Writing file...
Reading file...
Finished
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
To add: the test fails at runtime on 17.0.4
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
My organization appears to have been burned by this same problem using 17.0.6.270.
Devorah H., can you elucidate the scope of the problem fixed? Are there any situations where it's known that buffered and unformatted I/O using ifort2017 should still be safe?
Note my organization can not adopt ifort2018 because its run-time performance degraded for our code compared to ifort2017 for still unknown reasons.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page