59 integer :: nbatch_to_receive
60 integer :: nbatch_to_send
63 integer :: nblock_to_receive
64 integer :: nblock_to_send
66 logical :: gpu_aware = .false.
68 type(MPI_Request),
allocatable :: send_req(:)
108 class(states_elec_all_to_all_communications_t),
intent(inout) :: this
109 type(states_elec_t),
intent(in) :: st
110 integer,
intent(in) :: task_from, task_to
111 logical,
optional,
intent(in) :: gpu_aware
113 integer :: kpt_start, kpt_end
117 this%task_from = task_from
118 this%task_to = task_to
124 this%nbatch_to_receive = 0
125 if (task_from > -1)
then
126 kpt_start = st%st_kpt_task(task_from, 3)
127 kpt_end = st%st_kpt_task(task_from, 4)
128 this%nbatch_to_receive = this%nblock_to_receive * (kpt_end - kpt_start + 1)
131 write(
message(1),
'(a,i5,a,i5,a,i5)')
'Debug: Task ', st%st_kpt_mpi_grp%rank,
' will receive ', &
132 this%nbatch_to_receive,
' batches from task ', task_from
136 this%nblock_to_send = merge(st%group%block_end - st%group%block_start + 1, 0, task_to > -1)
137 this%nbatch_to_send = this%nblock_to_send * (st%d%kpt%end - st%d%kpt%start + 1)
139 write(
message(1),
'(a,i5,a,i5,a,i5)')
'Debug: Task ', st%st_kpt_mpi_grp%rank,
' will send ', &
140 this%nbatch_to_send,
' batches to task ', task_to
144 this%n_comms = max(this%nbatch_to_send, this%nbatch_to_receive)
154 integer,
intent(in) :: task_from
155 integer :: nblock_to_receive
157 integer :: st_start, st_end, ib
161 nblock_to_receive = 0
163 if (task_from > -1)
then
164 st_start = st%st_kpt_task(task_from, 1)
165 st_end = st%st_kpt_task(task_from, 2)
166 nblock_to_receive = 0
167 do ib = 1, st%group%nblocks
168 if (st%group%block_range(ib, 1) >= st_start .and. st%group%block_range(ib, 2) <= st_end)
then
169 nblock_to_receive = nblock_to_receive + 1
185 n_comms = this%n_comms
193 nbatch_to_receive = this%nbatch_to_receive
201 nbatch_to_send = this%nbatch_to_send
206 logical pure function states_elec_all_to_all_communications_process_receives(this, icom) result(receives)
208 integer,
intent(in) :: icom
210 receives = this%task_from > -1 .and. icom <= this%nbatch_to_receive
215 logical pure function states_elec_all_to_all_communications_process_sends(this, icom) result(sends)
217 integer,
intent(in) :: icom
219 sends = this%task_to > -1 .and. icom <= this%nbatch_to_send
226 type(states_elec_t),
intent(in) :: st
227 integer,
intent(in) :: icom
228 integer,
intent(in) :: np
229 type(wfs_elec_t),
intent(out) :: psib
231 integer :: block_id, ib, ik
236 block_id = mod(icom-1, this%nblock_to_receive)+1
237 ik = int((icom-block_id)/this%nblock_to_receive) + st%st_kpt_task(this%task_from, 3)
238 ib = block_id - 1 + st%group%iblock(st%st_kpt_task(this%task_from, 1))
240 write(message(1),
'(a,i5,a,i5,a,i5)')
'Debug: Task ', st%st_kpt_mpi_grp%rank,
' allocates memory for block ', &
241 ib,
' and k-point ', ik
242 call messages_info(1, all_nodes=.
true., debug_only=.
true.)
244 call states_elec_parallel_allocate_batch(st, psib, np, ib, ik, packed=.
true.)
247 if (this%gpu_aware)
then
248 call psib%do_pack(batch_device_packed, copy = .false.)
258 type(states_elec_t),
intent(in) :: st
259 integer,
intent(in) :: icom
260 integer,
intent(out) :: ib
261 integer,
intent(out) :: ik
266 ib = mod(icom-1, this%nblock_to_send) + 1
267 ik = int((icom-ib)/this%nblock_to_send) + st%d%kpt%start
268 ib = ib - 1 + st%group%iblock(st%st_start)
270 write(message(1),
'(a,i5,a,i5,a,i5)')
'Debug: Task ', st%st_kpt_mpi_grp%rank,
' will send the block ', &
271 ib,
' with k-point ', ik
272 call messages_info(1, all_nodes=.
true., debug_only=.
true.)
281 type(states_elec_t),
intent(in) :: st
282 integer,
intent(in) :: icom
283 integer,
intent(out) :: ib
284 integer,
intent(out) :: ik
289 ib = mod(icom-1, this%nblock_to_receive)+1
290 ik = int((icom-ib)/this%nblock_to_receive) + st%st_kpt_task(this%task_from, 3)
291 ib = ib - 1 + st%group%iblock(st%st_kpt_task(this%task_from, 1))
294 write(message(1),
'(a,i5,a,i5,a,i5)')
'Task ', st%st_kpt_mpi_grp%rank,
' will receive the block ', &
295 ib,
' with k-point ', ik
296 call messages_info(1, all_nodes=.
true.)
306 type(states_elec_t),
intent(in) :: st
309 call profiling_in(
"ALL_TO_ALL_COMM")
311 if (
allocated(this%send_req))
then
312 call st%st_kpt_mpi_grp%wait(this%nbatch_to_send, this%send_req)
313 safe_deallocate_a(this%send_req)
316 call profiling_out(
"ALL_TO_ALL_COMM")
323#include "states_elec_all_to_all_communications_inc.F90"
326#include "complex.F90"
327#include "states_elec_all_to_all_communications_inc.F90"
331#include "states_elec_all_to_all_communications_inc.F90"
334#include "complex32.F90"
335#include "states_elec_all_to_all_communications_inc.F90"
This module implements batches of mesh functions.
This module is intended to contain "only mathematical" functions and procedures.
This module defines the meshes, which are used in Octopus.
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module provides routines for communicating all batches in a ring-pattern scheme.
subroutine states_elec_all_to_all_communications_get_receive_indices(this, st, icom, ib, ik)
Given the icom step, returns the block and k-point indices to be received.
subroutine sstates_elec_all_to_all_communications_isend_batch_to(this, st, np, psib, node_to, icom, send_req)
Post a single MPI isend for an explicit batch to node_to.
subroutine zstates_elec_all_to_all_communications_isend_batch_to(this, st, np, psib, node_to, icom, send_req)
Post a single MPI isend for an explicit batch to node_to.
subroutine zstates_elec_all_to_all_communications_mpi_irecv_batch(this, st, np, node_fr, icom, psib_receiv, recv_req)
Allocate a batch and post the MPI_Irecv for it. The caller must wait on recv_req before using the bat...
subroutine sstates_elec_all_to_all_communications_mpi_irecv_batch(this, st, np, node_fr, icom, psib_receiv, recv_req)
Allocate a batch and post the MPI_Irecv for it. The caller must wait on recv_req before using the bat...
subroutine states_elec_all_to_all_communications_wait_all_isend(this, st)
Do an MPI waitall for the isend requests.
subroutine zstates_elec_all_to_all_communications_post_all_mpi_isend(this, st, np, node_to)
Post all isend commands for all batches of a given task.
integer pure function states_elec_all_to_all_communications_get_nreceive(this)
Returns the number of receiv calls.
subroutine sstates_elec_all_to_all_communications_recv_batch_from(this, st, np, psib, node_fr, icom)
Blocking MPI recv into an already-allocated batch from node_fr.
subroutine cstates_elec_all_to_all_communications_isend_batch_to(this, st, np, psib, node_to, icom, send_req)
Post a single MPI isend for an explicit batch to node_to.
subroutine states_elec_all_to_all_communications_alloc_receive_batch(this, st, icom, np, psib)
Given the icom step, allocate the receiv buffer (wfs_elec_t)
subroutine dstates_elec_all_to_all_communications_isend_batch(this, st, np, ib_send, ik_send, node_to, icom, send_req)
Post a single MPI isend for the batch (ib_send, ik_send) to node_to.
integer pure function states_elec_all_to_all_communications_get_ncom(this)
Returns the number of communications.
subroutine cstates_elec_all_to_all_communications_recv_batch_from(this, st, np, psib, node_fr, icom)
Blocking MPI recv into an already-allocated batch from node_fr.
subroutine dstates_elec_all_to_all_communications_post_all_mpi_isend(this, st, np, node_to)
Post all isend commands for all batches of a given task.
logical pure function states_elec_all_to_all_communications_process_receives(this, icom)
Returns true if communication step icom receives a batch from task_from.
integer function set_nblock_to_receive(st, task_from)
How many blocks we will receive from task_from.
subroutine states_elec_all_to_all_communications_get_send_indices(this, st, icom, ib, ik)
Given the icom step, returns the block and k-point indices to be sent.
subroutine cstates_elec_all_to_all_communications_post_all_mpi_isend(this, st, np, node_to)
Post all isend commands for all batches of a given task.
subroutine cstates_elec_all_to_all_communications_mpi_irecv_batch(this, st, np, node_fr, icom, psib_receiv, recv_req)
Allocate a batch and post the MPI_Irecv for it. The caller must wait on recv_req before using the bat...
logical pure function states_elec_all_to_all_communications_process_sends(this, icom)
Returns true if communication step icom sends a batch to task_to.
subroutine states_elec_all_to_all_communications_start(this, st, task_from, task_to, gpu_aware)
Given a task to send to, and a task to receive from, initializes a states_elec_all_to_all_communicati...
subroutine sstates_elec_all_to_all_communications_isend_batch(this, st, np, ib_send, ik_send, node_to, icom, send_req)
Post a single MPI isend for the batch (ib_send, ik_send) to node_to.
subroutine dstates_elec_all_to_all_communications_mpi_irecv_batch(this, st, np, node_fr, icom, psib_receiv, recv_req)
Allocate a batch and post the MPI_Irecv for it. The caller must wait on recv_req before using the bat...
subroutine cstates_elec_all_to_all_communications_isend_batch(this, st, np, ib_send, ik_send, node_to, icom, send_req)
Post a single MPI isend for the batch (ib_send, ik_send) to node_to.
subroutine zstates_elec_all_to_all_communications_recv_batch_from(this, st, np, psib, node_fr, icom)
Blocking MPI recv into an already-allocated batch from node_fr.
subroutine sstates_elec_all_to_all_communications_post_all_mpi_isend(this, st, np, node_to)
Post all isend commands for all batches of a given task.
subroutine dstates_elec_all_to_all_communications_isend_batch_to(this, st, np, psib, node_to, icom, send_req)
Post a single MPI isend for an explicit batch to node_to.
integer pure function states_elec_all_to_all_communications_get_nsend(this)
Returns the number send calls.
subroutine dstates_elec_all_to_all_communications_recv_batch_from(this, st, np, psib, node_fr, icom)
Blocking MPI recv into an already-allocated batch from node_fr.
subroutine zstates_elec_all_to_all_communications_isend_batch(this, st, np, ib_send, ik_send, node_to, icom, send_req)
Post a single MPI isend for the batch (ib_send, ik_send) to node_to.
This module provides routines for communicating states when using states parallelization.
The states_elec_t class contains all electronic wave functions.