Initializes a multiplication cycle for new set of C-blocks.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_mm_accdrv_type), | intent(inout) | :: | this | |||
type(dbcsr_work_type), | POINTER | :: | product_wm | |||
integer, | optional | :: | nlayers | |||
logical, | intent(in) | :: | keep_product_data |
SUBROUTINE dbcsr_mm_accdrv_init(this, product_wm, nlayers, keep_product_data)
!! Initializes a multiplication cycle for new set of C-blocks.
TYPE(dbcsr_mm_accdrv_type), INTENT(INOUT) :: this
TYPE(dbcsr_work_type), POINTER :: product_wm
INTEGER, OPTIONAL :: nlayers
LOGICAL, INTENT(IN) :: keep_product_data
CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_mm_accdrv_init'
INTEGER :: handle, ithread, my_nlayers
TYPE(dbcsr_data_obj) :: c_area
TYPE(thread_private_type), POINTER :: thread_privates
CALL timeset(routineN, handle)
ithread = 0
!$ ithread = OMP_GET_THREAD_NUM()
thread_privates => all_thread_privates(ithread)
! Setup global data which is reused in between multiplications
!------------------------------------------------------------------------
CALL setup_streams()
CALL setup_stackbuffers()
!Each thread has its own memtype with its own mempool
CALL dbcsr_memtype_setup(thread_privates%memtype_cbuffer, has_pool=.TRUE., acc_hostalloc=.TRUE., &
acc_devalloc=.TRUE., acc_stream=thread_streams(ithread + 1))
my_nlayers = 1
IF (PRESENT(nlayers)) my_nlayers = nlayers
this%nlayers = my_nlayers
CALL dbcsr_mempool_limit_capacity(thread_privates%memtype_cbuffer%pool, capacity=my_nlayers)
! Setup things for this particular multiplication
!------------------------------------------------------------------------
this%keep_product_data = keep_product_data
this%do_gpu_c_redux = .FALSE.
this%product_wm => product_wm
c_area = this%product_wm%data_area
CALL dbcsr_data_new(this%c_buffer, data_type=dbcsr_data_get_type(c_area), &
data_size=dbcsr_data_get_size(c_area), memory_type=thread_privates%memtype_cbuffer)
CALL acc_devmem_setzero_bytes(this%c_buffer%d%acc_devmem, &
stream=this%c_buffer%d%memory_type%acc_stream)
CALL acc_event_record(this%c_buffer%d%acc_ready, &
stream=this%c_buffer%d%memory_type%acc_stream)
CALL timestop(handle)
END SUBROUTINE dbcsr_mm_accdrv_init