Skip to content

Commit de4702e

Browse files
author
Gerald Paul Bowen Collom
committed
Use config flag for locality-aware mpi
1 parent b372b31 commit de4702e

File tree

10 files changed

+566
-4
lines changed

10 files changed

+566
-4
lines changed

src/parcsr_ls/par_cycle.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,17 @@ hypre_BoomerAMGCycle( void *amg_vdata,
286286
hypre_GpuProfilingPushRange(nvtx_name);
287287
while (Not_Finished)
288288
{
289+
#ifdef HYPRE_USING_NODE_AWARE_MPI
290+
if (level >= hypre_HandleNodeAwareSwitchoverThreshold(hypre_handle()))
291+
{
292+
//if (my_id == 0) { printf("LVL %d using node aware, th: %d\n", level, hypre_HandleNodeAwareSwitchoverThreshold(hypre_handle())); }
293+
hypre_HandleUsingNodeAwareMPI(hypre_handle()) = 1;
294+
} else
295+
{
296+
//if (my_id == 0) { printf("LVL %d NOT using node aware\n", level); }
297+
hypre_HandleUsingNodeAwareMPI(hypre_handle()) = 0;
298+
}
299+
#endif
289300
if (num_levels > 1)
290301
{
291302
local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[level]));

src/parcsr_mv/_hypre_parcsr_mv.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ extern "C" {
2323
#ifndef HYPRE_PAR_CSR_COMMUNICATION_HEADER
2424
#define HYPRE_PAR_CSR_COMMUNICATION_HEADER
2525

26+
#ifdef HYPRE_USING_NODE_AWARE_MPI
27+
#include "mpi_advance.h"
28+
#endif
29+
2630
/*--------------------------------------------------------------------------
2731
* hypre_ParCSRCommPkg:
2832
* Structure containing information for doing communications
@@ -59,13 +63,20 @@ typedef struct
5963
void *recv_data_buffer;
6064
HYPRE_Int num_requests;
6165
hypre_MPI_Request *requests;
66+
#ifdef HYPRE_USING_NODE_AWARE_MPI
67+
MPIX_Request *Xrequest;
68+
#endif
6269
} hypre_ParCSRCommHandle;
6370

6471
typedef hypre_ParCSRCommHandle hypre_ParCSRPersistentCommHandle;
6572

6673
typedef struct _hypre_ParCSRCommPkg
6774
{
6875
MPI_Comm comm;
76+
#ifdef HYPRE_USING_NODE_AWARE_MPI
77+
MPIX_Comm *neighbor_comm;
78+
MPIX_Comm *neighborT_comm;
79+
#endif
6980
HYPRE_Int num_components;
7081
HYPRE_Int num_sends;
7182
HYPRE_Int *send_procs;
@@ -75,6 +86,11 @@ typedef struct _hypre_ParCSRCommPkg
7586
HYPRE_Int num_recvs;
7687
HYPRE_Int *recv_procs;
7788
HYPRE_Int *recv_vec_starts;
89+
HYPRE_Int use_neighbor;
90+
#ifdef HYPRE_USING_NODE_AWARE_MPI
91+
long *global_send_indices;
92+
long *global_recv_indices;
93+
#endif
7894
/* remote communication information */
7995
hypre_MPI_Datatype *send_mpi_types;
8096
hypre_MPI_Datatype *recv_mpi_types;
@@ -787,6 +803,10 @@ HYPRE_Int hypre_RangeFillResponseIJDetermineRecvProcs ( void *p_recv_contact_buf
787803
HYPRE_Int hypre_FillResponseIJDetermineSendProcs ( void *p_recv_contact_buf, HYPRE_Int contact_size,
788804
HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf,
789805
HYPRE_Int *response_message_size );
806+
void hypre_ParCSRCreateCommGraph( HYPRE_BigInt first_col_diag,
807+
HYPRE_BigInt *col_map_offd,
808+
MPI_Comm comm,
809+
hypre_ParCSRCommPkg *comm_pkg );
790810

791811
/* numbers.c */
792812
hypre_NumbersNode *hypre_NumbersNewNode ( void );

src/parcsr_mv/new_commpkg.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
*-----------------------------------------------------*/
1212

1313
#include "_hypre_parcsr_mv.h"
14+
#ifdef HYPRE_USING_NODE_AWARE_MPI
15+
#include <mpi.h>
16+
#endif
1417

1518
/* some debugging tools*/
1619
#define mydebug 0
@@ -750,3 +753,58 @@ hypre_FillResponseIJDetermineSendProcs(void *p_recv_contact_buf,
750753

751754
return hypre_error_flag;
752755
}
756+
757+
/*--------------------------------------------------------------------
758+
* hypre_ParCSRCreateCommGraph
759+
*
760+
* Create communication topology graph for MPI neighborhood
761+
* collectives
762+
*--------------------------------------------------------------------*/
763+
764+
#ifdef HYPRE_USING_NODE_AWARE_MPI
765+
void
766+
hypre_ParCSRCreateCommGraph(HYPRE_BigInt first_col_diag,
767+
HYPRE_BigInt *col_map_offd,
768+
MPI_Comm comm,
769+
hypre_ParCSRCommPkg *comm_pkg) {
770+
HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg);
771+
HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg);
772+
HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg);
773+
HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg);
774+
HYPRE_Int *send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg);
775+
776+
int *sendcounts = (int *)malloc(num_sends * sizeof(int));
777+
int *recvcounts = (int *)malloc(num_recvs * sizeof(int));
778+
for (int i = 0; i < num_sends; i++) {
779+
sendcounts[i] = send_map_starts[i+1] - send_map_starts[i];
780+
}
781+
for (int i = 0; i < num_recvs; i++) {
782+
recvcounts[i] = recv_vec_starts[i+1] - recv_vec_starts[i];
783+
}
784+
MPIX_Dist_graph_create_adjacent( comm, num_recvs, hypre_ParCSRCommPkgRecvProcs(comm_pkg),
785+
recvcounts,
786+
num_sends, hypre_ParCSRCommPkgSendProcs(comm_pkg),
787+
sendcounts,
788+
MPI_INFO_NULL, 0, &(comm_pkg->neighbor_comm));
789+
MPIX_Dist_graph_create_adjacent( comm, num_sends, hypre_ParCSRCommPkgSendProcs(comm_pkg),
790+
sendcounts,
791+
num_recvs, hypre_ParCSRCommPkgRecvProcs(comm_pkg),
792+
recvcounts,
793+
MPI_INFO_NULL, 0, &(comm_pkg->neighborT_comm));
794+
795+
HYPRE_Int num_send_elmts = send_map_starts[num_sends];
796+
comm_pkg->global_send_indices = hypre_CTAlloc(long, num_send_elmts, HYPRE_MEMORY_HOST);
797+
for (int i = 0; i < num_sends; i++) {
798+
for (int j = send_map_starts[i]; j < send_map_starts[i+1]; j++) {
799+
comm_pkg->global_send_indices[j] = send_map_elmts[j] + first_col_diag;
800+
}
801+
}
802+
HYPRE_Int num_recv_elmts = recv_vec_starts[num_recvs];
803+
comm_pkg->global_recv_indices = hypre_CTAlloc(long, num_recv_elmts, HYPRE_MEMORY_HOST);
804+
for (int i = 0; i < num_recvs; i++) {
805+
for (int j = recv_vec_starts[i]; j < recv_vec_starts[i+1]; j++) {
806+
comm_pkg->global_recv_indices[j] = col_map_offd[j];
807+
}
808+
}
809+
}
810+
#endif

0 commit comments

Comments
 (0)