Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
gs_neighbour Module Reference

Defines gather-scatter communication using MPI neighbourhood collectives.

Data Types

type  gs_neighbour_t
 Gather-scatter communication using an MPI neighbourhood collective. The whole halo exchange is carried out by a single MPI_Ineighbor_alltoallv over a distributed-graph communicator built once from the send/recv peer lists. Compared to the point-to-point gs_mpi_t this trades N Isend/Irecv pairs for one collective call: a single entry into the (serialised, on Fugaku) MPI runtime, leaving the library free to stripe the transfers across all network interfaces internally. More...
 

Functions/Subroutines

subroutine gs_neighbour_init (this, send_pe, recv_pe)
 Initialise the neighbourhood-collective communication method See gs_comm.f90 for details.
 
subroutine gs_neighbour_init_vec (this)
 Allocate the fused vector exchange buffers and the nc-scaled collective descriptors, sized for GS_VEC_NC components. Deferred to the first fused exchange, see gs_comm_t. The graph communicator built in init is shared with the scalar exchange and is not touched here, so this stays rank local.
 
subroutine gs_neighbour_free (this)
 Deallocate the neighbourhood-collective communication method.
 
subroutine gs_nbsend_neighbour (this, u, n, tag, deps, strm)
 Pack the send buffer and initiate the neighbourhood collective. The collective covers both directions, so all of the communication is launched here; gs_nbrecv_neighbour is a no-op.
 
subroutine gs_nbrecv_neighbour (this, tag)
 No-op: the neighbourhood collective issued in nbsend handles both the send and receive directions, so there is nothing to pre-post here.
 
subroutine gs_nbwait_neighbour (this, u, n, op, strm)
 Wait for the neighbourhood collective and reduce the received slabs.
 
subroutine gs_nbsend_vec_neighbour (this, u, n, nc, tag, deps, strm)
 Pack the nc components and launch a single neighbourhood collective.
 
subroutine gs_nbrecv_vec_neighbour (this, tag, nc)
 No-op: the collective is launched in nbsend_vec.
 
subroutine gs_nbwait_vec_neighbour (this, u, n, nc, op, strm)
 Wait for the vector collective and reduce each received slab into u. Peer i's received slab holds nc consecutive blocks of recvcounts(i) values, matching the sender's packing convention.
 

Function/Subroutine Documentation

◆ gs_nbrecv_neighbour()

subroutine gs_neighbour::gs_nbrecv_neighbour ( class(gs_neighbour_t), intent(inout)  this,
integer, intent(in)  tag 
)
private

Definition at line 251 of file gs_neighbour.f90.

◆ gs_nbrecv_vec_neighbour()

subroutine gs_neighbour::gs_nbrecv_vec_neighbour ( class(gs_neighbour_t), intent(inout)  this,
integer, intent(in)  tag,
integer, intent(in)  nc 
)
private

Definition at line 388 of file gs_neighbour.f90.

◆ gs_nbsend_neighbour()

subroutine gs_neighbour::gs_nbsend_neighbour ( class(gs_neighbour_t), intent(inout)  this,
real(kind=rp), dimension(n), intent(inout)  u,
integer, intent(in)  n,
integer, intent(in)  tag,
type(c_ptr), intent(inout)  deps,
type(c_ptr), intent(inout)  strm 
)
private

Definition at line 210 of file gs_neighbour.f90.

◆ gs_nbsend_vec_neighbour()

subroutine gs_neighbour::gs_nbsend_vec_neighbour ( class(gs_neighbour_t), intent(inout)  this,
real(kind=rp), dimension(nc*n), intent(inout)  u,
integer, intent(in)  n,
integer, intent(in)  nc,
integer, intent(in)  tag,
type(c_ptr), intent(inout)  deps,
type(c_ptr), intent(inout)  strm 
)
private
Parameters
ucompact shared buffer, component-outer: u((c-1)*n + idx). Peer i's slab in send_buf_v holds nc consecutive blocks of sendcounts(i) values, so the collective descriptors are simply nc times the scalar ones.

Definition at line 341 of file gs_neighbour.f90.

◆ gs_nbwait_neighbour()

subroutine gs_neighbour::gs_nbwait_neighbour ( class(gs_neighbour_t), intent(inout)  this,
real(kind=rp), dimension(n), intent(inout)  u,
integer, intent(in)  n,
integer  op,
type(c_ptr), intent(inout)  strm 
)
private

Definition at line 258 of file gs_neighbour.f90.

◆ gs_nbwait_vec_neighbour()

subroutine gs_neighbour::gs_nbwait_vec_neighbour ( class(gs_neighbour_t), intent(inout)  this,
real(kind=rp), dimension(nc*n), intent(inout)  u,
integer, intent(in)  n,
integer, intent(in)  nc,
integer  op,
type(c_ptr), intent(inout)  strm 
)
private

Definition at line 397 of file gs_neighbour.f90.

◆ gs_neighbour_free()

subroutine gs_neighbour::gs_neighbour_free ( class(gs_neighbour_t), intent(inout)  this)
private

Definition at line 181 of file gs_neighbour.f90.

◆ gs_neighbour_init()

subroutine gs_neighbour::gs_neighbour_init ( class(gs_neighbour_t), intent(inout)  this,
type(stack_i4_t), intent(inout)  send_pe,
type(stack_i4_t), intent(inout)  recv_pe 
)

Unit weights for the graph. MPI_UNWEIGHTED is the natural choice but trips frt's mpi_f08 generic resolution; with reorder = .false. the weights never affect the neighbour ordering, so all-ones is equivalent.

Definition at line 95 of file gs_neighbour.f90.

◆ gs_neighbour_init_vec()

subroutine gs_neighbour::gs_neighbour_init_vec ( class(gs_neighbour_t), intent(inout)  this)
private

Definition at line 160 of file gs_neighbour.f90.