Optimize MPI communication in RestrictProlong and surface_integral
Cache Sync in RestrictProlong: replace 11 basic Parallel::Sync() calls with Parallel::Sync_cached() across RestrictProlong, RestrictProlong_aux, and ProlongRestrict to avoid rebuilding grid segment lists every call. Merge paired MPI_Allreduce in surface_integral: combine 9 pairs of consecutive RP/IP Allreduce calls into single calls with count=2*NN. Merge scalar MPI_Allreduce in surf_MassPAng: combine 3 groups of 7 scalar Allreduce calls (mass + angular/linear momentum) into single calls with count=7. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -363,8 +363,17 @@ void surface_integral::surf_Wave(double rex, int lev, cgh *GH, var *Rpsi4, var *
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
@@ -556,8 +565,17 @@ void surface_integral::surf_Wave(double rex, int lev, cgh *GH, var *Rpsi4, var *
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
@@ -735,8 +753,17 @@ void surface_integral::surf_Wave(double rex, int lev, ShellPatch *GH, var *Rpsi4
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
@@ -984,8 +1011,17 @@ void surface_integral::surf_Wave(double rex, int lev, ShellPatch *GH,
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
@@ -1419,8 +1455,17 @@ void surface_integral::surf_Wave(double rex, int lev, ShellPatch *GH,
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
@@ -1854,8 +1899,17 @@ void surface_integral::surf_Wave(double rex, int lev, cgh *GH,
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
@@ -2040,8 +2094,17 @@ void surface_integral::surf_Wave(double rex, int lev, NullShellPatch2 *GH, var *
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
@@ -2226,8 +2289,17 @@ void surface_integral::surf_Wave(double rex, int lev, NullShellPatch *GH, var *R
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
@@ -2464,15 +2536,13 @@ void surface_integral::surf_MassPAng(double rex, int lev, cgh *GH, var *chi, var
|
||||
}
|
||||
}
|
||||
|
||||
MPI_Allreduce(&Mass_out, &mass, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
|
||||
MPI_Allreduce(&ang_outx, &sx, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(&ang_outy, &sy, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(&ang_outz, &sz, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
|
||||
MPI_Allreduce(&p_outx, &px, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(&p_outy, &py, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(&p_outz, &pz, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double scalar_out[7] = {Mass_out, ang_outx, ang_outy, ang_outz, p_outx, p_outy, p_outz};
|
||||
double scalar_in[7];
|
||||
MPI_Allreduce(scalar_out, scalar_in, 7, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
mass = scalar_in[0]; sx = scalar_in[1]; sy = scalar_in[2]; sz = scalar_in[3];
|
||||
px = scalar_in[4]; py = scalar_in[5]; pz = scalar_in[6];
|
||||
}
|
||||
|
||||
#ifdef GaussInt
|
||||
mass = mass * rex * rex * dphi * factor;
|
||||
@@ -2735,15 +2805,13 @@ void surface_integral::surf_MassPAng(double rex, int lev, cgh *GH, var *chi, var
|
||||
}
|
||||
}
|
||||
|
||||
MPI_Allreduce(&Mass_out, &mass, 1, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
|
||||
MPI_Allreduce(&ang_outx, &sx, 1, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
MPI_Allreduce(&ang_outy, &sy, 1, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
MPI_Allreduce(&ang_outz, &sz, 1, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
|
||||
MPI_Allreduce(&p_outx, &px, 1, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
MPI_Allreduce(&p_outy, &py, 1, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
MPI_Allreduce(&p_outz, &pz, 1, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
{
|
||||
double scalar_out[7] = {Mass_out, ang_outx, ang_outy, ang_outz, p_outx, p_outy, p_outz};
|
||||
double scalar_in[7];
|
||||
MPI_Allreduce(scalar_out, scalar_in, 7, MPI_DOUBLE, MPI_SUM, Comm_here);
|
||||
mass = scalar_in[0]; sx = scalar_in[1]; sy = scalar_in[2]; sz = scalar_in[3];
|
||||
px = scalar_in[4]; py = scalar_in[5]; pz = scalar_in[6];
|
||||
}
|
||||
|
||||
#ifdef GaussInt
|
||||
mass = mass * rex * rex * dphi * factor;
|
||||
@@ -3020,15 +3088,13 @@ void surface_integral::surf_MassPAng(double rex, int lev, ShellPatch *GH, var *c
|
||||
}
|
||||
}
|
||||
|
||||
MPI_Allreduce(&Mass_out, &mass, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
|
||||
MPI_Allreduce(&ang_outx, &sx, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(&ang_outy, &sy, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(&ang_outz, &sz, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
|
||||
MPI_Allreduce(&p_outx, &px, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(&p_outy, &py, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(&p_outz, &pz, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double scalar_out[7] = {Mass_out, ang_outx, ang_outy, ang_outz, p_outx, p_outy, p_outz};
|
||||
double scalar_in[7];
|
||||
MPI_Allreduce(scalar_out, scalar_in, 7, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
mass = scalar_in[0]; sx = scalar_in[1]; sy = scalar_in[2]; sz = scalar_in[3];
|
||||
px = scalar_in[4]; py = scalar_in[5]; pz = scalar_in[6];
|
||||
}
|
||||
|
||||
#ifdef GaussInt
|
||||
mass = mass * rex * rex * dphi * factor;
|
||||
@@ -3607,8 +3673,17 @@ void surface_integral::surf_Wave(double rex, cgh *GH, ShellPatch *SH,
|
||||
}
|
||||
//|------+ Communicate and sum the results from each processor.
|
||||
|
||||
MPI_Allreduce(RP_out, RP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
MPI_Allreduce(IP_out, IP, NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
{
|
||||
double *RPIP_out = new double[2 * NN];
|
||||
double *RPIP = new double[2 * NN];
|
||||
memcpy(RPIP_out, RP_out, NN * sizeof(double));
|
||||
memcpy(RPIP_out + NN, IP_out, NN * sizeof(double));
|
||||
MPI_Allreduce(RPIP_out, RPIP, 2 * NN, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
|
||||
memcpy(RP, RPIP, NN * sizeof(double));
|
||||
memcpy(IP, RPIP + NN, NN * sizeof(double));
|
||||
delete[] RPIP_out;
|
||||
delete[] RPIP;
|
||||
}
|
||||
|
||||
//|------= Free memory.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user