[netcdfgroup] performance of parallel I/O

Hi,
Good day! I am attaching a Fortran code in that, I am trying parallel IO. It is writing approx 56 GB data. But, to call *nf90_def_var *takes a lot time approx 90 sec. Also, *nf90_unlimited* does not work when I replace NZ with *nf90_unlimited*. It probably fails during write operation it gives "HDF error". Please could you suggest me how can I improve performance in parallel I/O. I am attaching the file here.

Thanks a lot in advance
Alok
       use netcdf
       use mpi
       character (len = *), parameter :: FILE_NAME = "a_xy.nc"
       integer, parameter :: NDIMS =3,NX=10000,NY=880,NZ=1600 
       real(4) A(NX,NY)
       integer I,J
       integer ncid, varid, dimids(NDIMS),chunksizes(NDIMS)
       integer x_dimid, y_dimid,z_dimid
       integer start(NDIMS),count(NDIMS)
       integer rank,nprocs,J1,J2,ierr
       double precision t1,t2,t3,t4

       call MPI_Init(ierr)
       call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
       call MPI_Comm_size(MPI_COMM_WORLD, nprocs, ierr)
       J1=rank*NZ/nprocs+1
       J2=(rank+1)*NZ/nprocs

       DO J=1,NY
       DO I=1,NX
       A(I,J)=rand()
       ENDDO
       ENDDO
       T3=MPI_WTIME() 
       call check( nf90_create(FILE_NAME, NF90_NETCDF4, &
        ncid, comm=MPI_COMM_WORLD, &
       info = MPI_INFO_NULL) )
       call check( nf90_def_dim(ncid, "y", NY, y_dimid) )
       call check( nf90_def_dim(ncid, "x", NX, x_dimid) )
       call check( nf90_def_dim(ncid, "z", NZ, z_dimid) )  

       
       dimids =  (/x_dimid, y_dimid,z_dimid/)
       T4=MPI_WTIME()
       call check(nf90_def_var(ncid, "data", NF90_REAL4, dimids,varid))
       call check( nf90_enddef(ncid) )
       T1=MPI_WTIME()
       DO J=J1,J2
       start=  (/1,1,J /)
       count=  (/NX,NY,1/)
       call check( nf90_put_var(ncid, varid, A,start = start, &
       count = count) )
       ENDDO
       call check( nf90_close(ncid) )
       T2=MPI_WTIME()
       print* ,'TIME',T2-T1,T1-T3,T1-T4,T1,rank
       call mpi_finalize(ierr)
        
contains
       subroutine check(status)
       integer, intent ( in) :: status
       if(status /= nf90_noerr) then
       print *, trim(nf90_strerror(status))
       stop 2
       end if
       end subroutine 
       end 
  • 2010 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdfgroup archives: