darray_get_i32 Subroutine

private subroutine darray_get_i32(handle, ilo, ihi, jlo, jhi, buffer)

Arguments

Type IntentOptional Attributes Name
integer(kind=int32), intent(in) :: handle
integer(kind=int32), intent(in) :: ilo
integer(kind=int32), intent(in) :: ihi
integer(kind=int32), intent(in) :: jlo
integer(kind=int32), intent(in) :: jhi
integer(kind=int32), intent(out) :: buffer(*)

Calls

proc~~darray_get_i32~~CallsGraph proc~darray_get_i32 darray_get_i32 interface~waitall waitall proc~darray_get_i32->interface~waitall proc~get_local_offset get_local_offset proc~darray_get_i32->proc~get_local_offset proc~get_owner get_owner proc~darray_get_i32->proc~get_owner proc~win_flush_all win_t%win_flush_all proc~darray_get_i32->proc~win_flush_all proc~win_lock_all win_t%win_lock_all proc~darray_get_i32->proc~win_lock_all proc~win_rget_i32 win_t%win_rget_i32 proc~darray_get_i32->proc~win_rget_i32 proc~win_unlock_all win_t%win_unlock_all proc~darray_get_i32->proc~win_unlock_all proc~request_waitall request_waitall interface~waitall->proc~request_waitall proc~get_local_offset->proc~get_owner proc~calculate_distribution calculate_distribution proc~get_local_offset->proc~calculate_distribution mpi_win_flush_all mpi_win_flush_all proc~win_flush_all->mpi_win_flush_all mpi_win_lock_all mpi_win_lock_all proc~win_lock_all->mpi_win_lock_all mpi_rget mpi_rget proc~win_rget_i32->mpi_rget mpi_win_unlock_all mpi_win_unlock_all proc~win_unlock_all->mpi_win_unlock_all mpi_waitall mpi_waitall proc~request_waitall->mpi_waitall

Called by

proc~~darray_get_i32~~CalledByGraph proc~darray_get_i32 darray_get_i32 interface~darray_get darray_get interface~darray_get->proc~darray_get_i32

Variables

Type Visibility Attributes Name Initial
type(darray_t), private, pointer :: arr
integer(kind=int32), private :: buf_offset
integer(kind=int32), private :: col
integer(kind=MPI_ADDRESS_KIND), private :: disp
integer(kind=int32), private :: j
integer(kind=int32), private :: ncols_req
integer(kind=int32), private :: nranks
integer(kind=int32), private :: nrows_patch
integer(kind=int32), private :: owner
integer(kind=int32), private :: req_count
type(request_t), private, allocatable :: requests(:)

Source Code

   subroutine darray_get_i32(handle, ilo, ihi, jlo, jhi, buffer)
      integer(int32), intent(in) :: handle, ilo, ihi, jlo, jhi
      integer(int32), intent(out) :: buffer(*)
      type(darray_t), pointer :: arr
      type(request_t), allocatable :: requests(:)
      integer(MPI_ADDRESS_KIND) :: disp
      integer(int32) :: j, col, owner, nrows_patch, buf_offset, req_count, nranks, ncols_req

      arr => registry(handle)
      nrows_patch = ihi - ilo + 1
      nranks = global_comm%size()
      ncols_req = jhi - jlo + 1

      allocate (requests(ncols_req))
      call arr%win%lock_all()

      req_count = 0
      do j = jlo, jhi
         col = j - 1
         owner = get_owner(arr%ncols, nranks, col)
         disp = get_local_offset(arr%nrows, arr%ncols, nranks, ilo - 1, col)
         buf_offset = (j - jlo)*nrows_patch + 1
         req_count = req_count + 1
         call arr%win%rget_i32(owner, disp, nrows_patch, buffer(buf_offset), requests(req_count))
      end do

      call arr%win%flush_all()
      call waitall(requests(1:req_count))
      call arr%win%unlock_all()
      deallocate (requests)
   end subroutine darray_get_i32