-
Notifications
You must be signed in to change notification settings - Fork 192
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use config flag for locality-aware mpi #941
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
|
@@ -286,6 +286,15 @@ hypre_BoomerAMGCycle( void *amg_vdata, | |||
hypre_GpuProfilingPushRange(nvtx_name); | ||||
while (Not_Finished) | ||||
{ | ||||
#ifdef HYPRE_USING_NODE_AWARE_MPI | ||||
if (level >= hypre_HandleNodeAwareSwitchoverThreshold(hypre_handle())) | ||||
{ | ||||
hypre_HandleUsingNodeAwareMPI(hypre_handle()) = 1; | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @liruipeng however, this other global variable (which turns off/on node aware MPI) cannot. One idea is to move it to the comm_pkg struct. PS: we could have it defaulted to zero, and implement something like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think to do that, comm_pkg would need to be accessible within There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can use hypre/src/parcsr_mv/par_csr_matrix.h Line 108 in 36ab29b
e.g., There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I could be wrong...but to what granularity do we want to control There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As far as I can see, the node aware option has been implemented only for the IJ interface. If we want it on the other interfaces in the future, we could extend their respective comm_pkg structs to handle this option. Note I'm suggesting to put There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This may still work but it's my understanding that we have multiple matrices per level that each have a comm pkg. The There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks @geraldc-unm! I spoke to Rui Peng and shared that's a better approach in my opinion. Let's think about this (moving the variable to inside comm_pkg) a bit more... |
||||
} else | ||||
{ | ||||
hypre_HandleUsingNodeAwareMPI(hypre_handle()) = 0; | ||||
} | ||||
#endif | ||||
if (num_levels > 1) | ||||
{ | ||||
local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[level])); | ||||
|
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
|
@@ -23,6 +23,10 @@ extern "C" { | |||
#ifndef HYPRE_PAR_CSR_COMMUNICATION_HEADER | ||||
#define HYPRE_PAR_CSR_COMMUNICATION_HEADER | ||||
|
||||
#ifdef HYPRE_USING_NODE_AWARE_MPI | ||||
#include "mpi_advance.h" | ||||
#endif | ||||
|
||||
/*-------------------------------------------------------------------------- | ||||
* hypre_ParCSRCommPkg: | ||||
* Structure containing information for doing communications | ||||
|
@@ -59,13 +63,20 @@ typedef struct | |||
void *recv_data_buffer; | ||||
HYPRE_Int num_requests; | ||||
hypre_MPI_Request *requests; | ||||
#ifdef HYPRE_USING_NODE_AWARE_MPI | ||||
MPIX_Request *Xrequest; | ||||
#endif | ||||
} hypre_ParCSRCommHandle; | ||||
|
||||
typedef hypre_ParCSRCommHandle hypre_ParCSRPersistentCommHandle; | ||||
|
||||
typedef struct _hypre_ParCSRCommPkg | ||||
{ | ||||
MPI_Comm comm; | ||||
#ifdef HYPRE_USING_NODE_AWARE_MPI | ||||
MPIX_Comm *neighbor_comm; | ||||
MPIX_Comm *neighborT_comm; | ||||
#endif | ||||
HYPRE_Int num_components; | ||||
HYPRE_Int num_sends; | ||||
HYPRE_Int *send_procs; | ||||
|
@@ -75,6 +86,11 @@ typedef struct _hypre_ParCSRCommPkg | |||
HYPRE_Int num_recvs; | ||||
HYPRE_Int *recv_procs; | ||||
HYPRE_Int *recv_vec_starts; | ||||
HYPRE_Int use_neighbor; | ||||
#ifdef HYPRE_USING_NODE_AWARE_MPI | ||||
long *global_send_indices; | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe it's better to use Line 33 in 36ab29b
hypre_longint here
|
||||
long *global_recv_indices; | ||||
#endif | ||||
/* remote communication information */ | ||||
hypre_MPI_Datatype *send_mpi_types; | ||||
hypre_MPI_Datatype *recv_mpi_types; | ||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@liruipeng This switch threshold could be moved inside the AMG struct
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For this one, I think it could be in the AMG struct as long as it can still be set when parsing command line args, where the value comes from
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK. We have the access to
hypre_ParAMGData
in this function. Do we needhypre_HandleNodeAwareSwitchoverThreshold
in other functions that don't have the access?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can only see it being used at
par_cycle.c
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So I didn't check these in as permanent changes to the ij driver but to properly use node aware, you must set this hypre_HandleNodeAwareSwitchoverThreshold otherwise it will unoptimally use node aware mpi for every amg level.
This brings up 2 things:
NodeAwareSwitchoverThreshold
must be accessible to set like from the ij.c driver. It's quite nice to have it as a command line arg to test different thresholds without recompiling or anything.We probably want to document this and how to connect to MPI advance. I can compile the steps and maybe we could include it somewhere in the wiki or something? But I don't know how to contribute to the wiki.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
HYPRE_BoomerAMGSetNodeAwareSwitchLevel
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Documenting it in the Wiki is a good idea.