Defines a gather-scatter backend using the native Tofu interconnect (uTofu). Each rank registers its receive buffer once and a send is a single one-sided RDMA put straight into the neighbour's buffer, with the arrival signal fused into the descriptor (edata) instead of a separate atomic/credit message. Injection is non-blocking and thread-parallel: each OpenMP thread owns one injection VCQ (created thread-safe, dealt over the TNIs) and fires the puts for its share of the peers itself. The fused vector (multi-component) exchange of gs_op_r3 is supported through a second, independent context with its own buffers, receive VCQ, and parity. See gs_utofu_aux.c for the transport.
|
| subroutine | gs_utofu_init (this, send_pe, recv_pe) |
| | Initialise the uTofu communication method. See gs_comm.f90 for details.
|
| |
| subroutine | gs_utofu_free (this) |
| | Deallocate the uTofu communication method.
|
| |
| subroutine | gs_nbsend_utofu (this, u, n, tag, deps, strm) |
| | Pack the send slabs and fire all one-sided puts (non-blocking).
|
| |
| subroutine | gs_nbrecv_utofu (this, tag) |
| | No-op: the one-sided receive buffer is registered once at init, so there is nothing to post per round.
|
| |
| subroutine | gs_nbwait_utofu (this, u, n, op, strm) |
| | Poll for incoming puts, reducing each slab into u as it lands, then wait for our own sends to drain and flip the double-buffer parity.
|
| |
| subroutine | gs_nbsend_vec_utofu (this, u, n, nc, tag, deps, strm) |
| | Pack the fused nc-component send slabs and fire the puts (non-blocking).
|
| |
| subroutine | gs_nbrecv_vec_utofu (this, tag, nc) |
| | No-op: the vector receive buffer is registered once at init, so there is nothing to post per round.
|
| |
| subroutine | gs_nbwait_vec_utofu (this, u, n, nc, op, strm) |
| | Poll for incoming vector puts, reducing each nc-component slab into u as it lands, then flip the vector double-buffer parity. Same protocol as gs_nbwait_utofu, on the vector context and parity.
|
| |
◆ gs_nbrecv_utofu()
◆ gs_nbrecv_vec_utofu()
◆ gs_nbsend_utofu()
| subroutine gs_utofu::gs_nbsend_utofu |
( |
class(gs_utofu_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 |
◆ gs_nbsend_vec_utofu()
| subroutine gs_utofu::gs_nbsend_vec_utofu |
( |
class(gs_utofu_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
-
| u | compact shared buffer, component-outer: u((c-1)*n + idx). Peer i's slab holds nc consecutive blocks of send_len(i) values, so the scalar layout is reused scaled by nc. Same protocol as gs_nbsend_utofu, on the vector context and parity. |
Definition at line 734 of file gs_utofu.F90.
◆ gs_nbwait_utofu()
◆ gs_nbwait_vec_utofu()
| subroutine gs_utofu::gs_nbwait_vec_utofu |
( |
class(gs_utofu_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 |
◆ gs_utofu_free()
◆ gs_utofu_init()
◆ gs_utofu_xchg_tag
◆ gs_utofu_xchg_tag_v