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