acc_devmem_ensure_size_bytes Subroutine

public subroutine acc_devmem_ensure_size_bytes(this, stream, requested_size_in_bytes, nocopy, zero_pad)

Ensures that given devmem has at least the requested size.

Arguments

Type IntentOptional Attributes Name
type(acc_devmem_type), intent(inout) :: this

device memory

type(acc_stream_type), intent(in) :: stream

on which zeroing and memcopying is performed

integer, intent(in) :: requested_size_in_bytes

requested size in bytes

logical, intent(in), optional :: nocopy

if after growin old content should NOT be copied over. Default: false. if after growing the new memory should be zeroed. Default: false.

logical, intent(in), optional :: zero_pad

if after growin old content should NOT be copied over. Default: false. if after growing the new memory should be zeroed. Default: false.


Source Code

   SUBROUTINE acc_devmem_ensure_size_bytes(this, stream, requested_size_in_bytes, nocopy, zero_pad)
      !! Ensures that given devmem has at least the requested size.

      TYPE(acc_devmem_type), &
         INTENT(INOUT)                          :: this
         !! device memory
      TYPE(acc_stream_type), INTENT(IN) :: stream
         !! on which zeroing and memcopying is performed
      INTEGER, INTENT(IN)                      :: requested_size_in_bytes
         !! requested size in bytes
      LOGICAL, INTENT(IN), OPTIONAL            :: nocopy, zero_pad
         !! if after growin old content should NOT be copied over. Default: false.
         !! if after growing the new memory should be zeroed. Default: false.

#if ! defined (__DBCSR_ACC)
      MARK_USED(this)
      MARK_USED(stream)
      MARK_USED(requested_size_in_bytes)
      MARK_USED(nocopy)
      MARK_USED(zero_pad)
      DBCSR_ABORT("__DBCSR_ACC not compiled in.")
#else

      LOGICAL                                  :: my_nocopy, my_zero_pad
      TYPE(C_PTR)                              :: old_cptr, new_cptr, stream_cptr
      INTEGER                                  :: new_size, old_size, istat

      IF (this%size_in_bytes < 0) &
         DBCSR_ABORT("acc_devmem_ensure_size_bytes: not allocated")
      IF (.NOT. acc_stream_associated(stream)) &
         DBCSR_ABORT("acc_devmem_ensure_size_bytes: stream not associated")

      IF (this%size_in_bytes < requested_size_in_bytes) THEN
         !WRITE (*,*) "acc_devmem_ensure_size_bytes: growing dev_mem to: ", data_size

         CALL dbcsr_acc_set_active_device(get_accdrv_active_device_id())

         new_size = requested_size_in_bytes
         old_size = this%size_in_bytes
         old_cptr = this%cptr

         new_cptr = C_NULL_PTR
         istat = acc_interface_dev_mem_alloc(new_cptr, INT(new_size, KIND=C_SIZE_T))
         IF (istat /= 0) &
            DBCSR_ABORT("acc_devmem_ensure_size_bytes: alloc failed")

         this%cptr = new_cptr
         this%size_in_bytes = requested_size_in_bytes

         my_zero_pad = .FALSE.
         IF (PRESENT(zero_pad)) my_zero_pad = zero_pad
         IF (my_zero_pad) &
            CALL acc_devmem_setzero_bytes(this, first_byte=old_size + 1, stream=stream)

         my_nocopy = .FALSE.
         IF (PRESENT(nocopy)) my_nocopy = nocopy
         IF (.NOT. my_nocopy) THEN
            stream_cptr = acc_stream_cptr(stream)
            istat = acc_interface_memcpy_d2d(old_cptr, new_cptr, INT(old_size, KIND=C_SIZE_T), stream_cptr)
            IF (istat /= 0) &
               DBCSR_ABORT("acc_devmem_ensure_size_bytes: memcpy failed")
         END IF

         CALL acc_stream_synchronize(stream)
         istat = acc_interface_dev_mem_dealloc(old_cptr)
         IF (istat /= 0) &
            DBCSR_ABORT("acc_devmem_ensure_size_bytes: dealloc failed")

      END IF
#endif
   END SUBROUTINE acc_devmem_ensure_size_bytes