From 74aba9e3b242b52db8da72b61d36ddc740bcf687 Mon Sep 17 00:00:00 2001 From: Sebastien Valat Date: Fri, 19 Jun 2026 11:06:30 +0200 Subject: [PATCH 1/3] refactor: axis communication by using Buffer (step 1 - add communication and validate they are identic) --- src/fluid/boundary/axis.cpp | 170 +++++++++++++++++++++++++++++++----- src/fluid/boundary/axis.hpp | 6 ++ src/mpi/buffer.hpp | 61 +++++++++++++ 3 files changed, 217 insertions(+), 20 deletions(-) diff --git a/src/fluid/boundary/axis.cpp b/src/fluid/boundary/axis.cpp index 47f0c2954..da658e6c1 100644 --- a/src/fluid/boundary/axis.cpp +++ b/src/fluid/boundary/axis.cpp @@ -5,6 +5,11 @@ // Licensed under CeCILL 2.1 License, see COPYING for more information // *********************************************************************************** +#undef NDEBUG +#include +#include +#include + #include #include "axis.hpp" #include "boundary.hpp" @@ -395,17 +400,24 @@ void Axis::ExchangeMPI(int side) { int ibeg,iend,jbeg,jend,kbeg,kend,offset; int nx,ny,nz; auto bufferSend = this->bufferSend; + Buffer bufferSendNew = this->bufferSendNew; IdefixArray1D map = this->mapVars; IdefixArray4D Vc = this->Vc; IdefixArray4D Vs = this->Vs; + //reset pointer + bufferSendNew.ResetPointer(); + // If MPI Persistent, start receiving even before the buffers are filled MPI_Status sendStatus; MPI_Status recvStatus; + MPI_Status sendStatusNew; + MPI_Status recvStatusNew; double tStart = MPI_Wtime(); MPI_SAFE_CALL(MPI_Start(&recvRequest)); + MPI_SAFE_CALL(MPI_Start(&recvRequestNew)); idfx::mpiCallsTimer += MPI_Wtime() - tStart; // Coordinates of the ghost region which needs to be transfered @@ -419,73 +431,145 @@ void Axis::ExchangeMPI(int side) { kbeg = data->beg[KDIR]; kend = data->end[KDIR]; nz = kend - kbeg; + + // Create the box + BoundingBox baseBox; + baseBox[IDIR][0] = ibeg; + baseBox[IDIR][1] = iend; + baseBox[JDIR][0] = jbeg; + baseBox[JDIR][1] = jend; + baseBox[KDIR][0] = kbeg; + baseBox[KDIR][1] = kend; + if(side==left) { + //shift by NY + BoundingBox sendBoxVc = baseBox; + sendBoxVc[JDIR][0] += ny; + sendBoxVc[JDIR][1] += ny; + bufferSendNew.Pack(Vc, map, sendBoxVc); + idefix_for("LoadBufferX2Vc",0,mapNVars,kbeg,kend,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA (int n, int k, int j, int i) { - bufferSend(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz ) = + const int storeId = i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz; + bufferSend(storeId ) = Vc(map(n),k,j+ny,i); + assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); } ); + if (haveMHD) { + //extend by one + BoundingBox sendBoxVsIdir = sendBoxVc; + sendBoxVsIdir[IDIR][1] += 1; + bufferSendNew.Pack(Vs, IDIR, sendBoxVsIdir); + int VsIndex = mapNVars*nx*ny*nz; idefix_for("LoadBufferX2IDIR",kbeg,kend,jbeg,jend,ibeg,iend+1, KOKKOS_LAMBDA (int k, int j, int i) { - bufferSend(i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex ) = + const int storeId = i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex; + bufferSend(storeId ) = Vs(IDIR,k,j+ny,i); + assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); } ); + + //extend by one + BoundingBox sendBoxVsKdir = sendBoxVc; + sendBoxVsKdir[KDIR][1] += 1; + bufferSendNew.Pack(Vs, KDIR, sendBoxVsKdir); + VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; idefix_for("LoadBufferX2KDIR",kbeg,kend+1,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA (int k, int j, int i) { - bufferSend(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex ) = + const int storeId = i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex; + bufferSend(storeId) = Vs(KDIR,k,j+ny,i); + assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); } ); } // MHD } else if(side==right) { + //shift by offset - NY (to pub on right) + BoundingBox sendBoxVc = baseBox; + sendBoxVc[JDIR][0] += offset - ny; + sendBoxVc[JDIR][1] += offset - ny; + bufferSendNew.Pack(Vc, map, sendBoxVc); + idefix_for("LoadBufferX2Vc",0,mapNVars,kbeg,kend,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA (int n, int k, int j, int i) { - bufferSend(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz ) = + const int storeId = i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz; + bufferSend(storeId) = Vc(map(n),k,j+offset-ny,i); + assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); } ); // Load face-centered field in the buffer if (haveMHD) { + //extend by one + BoundingBox sendBoxVsIdir = baseBox; + sendBoxVsIdir[IDIR][1] += 1; + sendBoxVsIdir[JDIR][0] += offset - ny; + sendBoxVsIdir[JDIR][1] += offset - ny; + bufferSendNew.Pack(Vs, IDIR, sendBoxVsIdir); + int VsIndex = mapNVars*nx*ny*nz; idefix_for("LoadBufferX2IDIR",kbeg,kend,jbeg,jend,ibeg,iend+1, KOKKOS_LAMBDA (int k, int j, int i) { - bufferSend(i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex ) = + const int storeId = i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex; + bufferSend(storeId) = Vs(IDIR,k,j+offset-ny,i); + assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); } ); - VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; + //extend by one + BoundingBox sendBoxVsKdir = baseBox; + sendBoxVsKdir[KDIR][1] += 1; + sendBoxVsKdir[JDIR][0] += offset - ny; + sendBoxVsKdir[JDIR][1] += offset - ny; + bufferSendNew.Pack(Vs, KDIR, sendBoxVsKdir); + + VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; idefix_for("LoadBufferX2KDIR",kbeg,kend+1,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA (int k, int j, int i) { - bufferSend(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex ) = + const int storeId = i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex; + bufferSend(storeId ) = Vs(KDIR,k,j+offset-ny,i); + assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); } ); } // MHD } // side==right + assert(bufferSendNew.getArray().size() == bufferSend.size()); + Kokkos::fence(); tStart = MPI_Wtime(); MPI_SAFE_CALL(MPI_Start(&sendRequest)); - MPI_Wait(&recvRequest,&recvStatus); + MPI_SAFE_CALL(MPI_Start(&sendRequestNew)); + MPI_Wait(&recvRequest,&recvStatusNew); + MPI_Wait(&recvRequestNew,&recvStatusNew); idfx::mpiCallsTimer += MPI_Wtime() - tStart; // Unpack auto bufferRecv=this->bufferRecv; + Buffer bufferRecvNew=this->bufferRecvNew; + bufferRecvNew.ResetPointer(); auto sVc = this->symmetryVc; + assert(bufferRecvNew.getArray().size() == bufferRecv.size()); + if(side==left) { + //unpack Vc + BoundingBox recvBoxVc = baseBox; + bufferRecvNew.UnpackJDirSymetric(Vc, map, sVc, recvBoxVc); + idefix_for("StoreBufferAxis",0,mapNVars,kbeg,kend,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA (int n, int k, int j, int i) { - Vc(map(n),k,jend-(j-jbeg)-1,i) = - sVc(map(n))*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz ); + assert(Vc(map(n),k,jend-(j-jbeg)-1,i) == + sVc(map(n))*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz )); } ); @@ -493,27 +577,44 @@ void Axis::ExchangeMPI(int side) { if (haveMHD) { int VsIndex = mapNVars*nx*ny*nz; auto sVs = this->symmetryVs; + + //unpack Vc + BoundingBox recvBoxVsIdir = baseBox; + recvBoxVsIdir[IDIR][1] += 1; + bufferRecvNew.UnpackJDirSymetric(Vs, IDIR, sVs(IDIR), recvBoxVsIdir); + idefix_for("StoreBufferX2IDIR",kbeg,kend,jbeg,jend,ibeg,iend+1, KOKKOS_LAMBDA (int k, int j, int i) { - Vs(IDIR,k,jend-(j-jbeg)-1,i) = - sVs(IDIR)*bufferRecv(i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex ); + assert(Vs(IDIR,k,jend-(j-jbeg)-1,i) == + sVs(IDIR)*bufferRecv(i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex )); } ); VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; + //unpack Vc + BoundingBox recvBoxVsKdir = baseBox; + recvBoxVsKdir[KDIR][1] += 1; + bufferRecvNew.UnpackJDirSymetric(Vs, KDIR, sVs(KDIR), recvBoxVsKdir); + idefix_for("StoreBufferX2KDIR",kbeg,kend+1,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA ( int k, int j, int i) { - Vs(KDIR,k,jend-(j-jbeg)-1,i) = - sVs(KDIR)*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex ); + assert(Vs(KDIR,k,jend-(j-jbeg)-1,i) == + sVs(KDIR)*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex )); } ); } } else if(side==right) { + //unpack Vc + BoundingBox recvBoxVc = baseBox; + recvBoxVc[JDIR][0] += offset; + recvBoxVc[JDIR][1] += offset; + bufferRecvNew.UnpackJDirSymetric(Vc, map, sVc, recvBoxVc); + idefix_for("StoreBufferAxis",0,mapNVars,kbeg,kend,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA (int n, int k, int j, int i) { - Vc(map(n),k,jend-(j-jbeg)-1+offset,i) = - sVc(map(n))*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz ); + assert(Vc(map(n),k,jend-(j-jbeg)-1+offset,i) == + sVc(map(n))*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz )); } ); @@ -521,24 +622,40 @@ void Axis::ExchangeMPI(int side) { if (haveMHD) { int VsIndex = mapNVars*nx*ny*nz; auto sVs = this->symmetryVs; + + //unpack Vc + BoundingBox recvBoxVsIdir = baseBox; + recvBoxVsIdir[IDIR][1] += 1; + recvBoxVsIdir[JDIR][0] += offset; + recvBoxVsIdir[JDIR][1] += offset; + bufferRecvNew.UnpackJDirSymetric(Vs, IDIR, sVs(IDIR), recvBoxVsIdir); + idefix_for("StoreBufferX2IDIR",kbeg,kend,jbeg,jend,ibeg,iend+1, KOKKOS_LAMBDA (int k, int j, int i) { - Vs(IDIR,k,jend-(j-jbeg)-1+offset,i) = - sVs(IDIR)*bufferRecv(i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex ); + assert(Vs(IDIR,k,jend-(j-jbeg)-1+offset,i) == + sVs(IDIR)*bufferRecv(i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex )); } ); VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; + //unpack Vc + BoundingBox recvBoxVsKdir = baseBox; + recvBoxVsKdir[KDIR][1] += 1; + recvBoxVsKdir[JDIR][0] += offset; + recvBoxVsKdir[JDIR][1] += offset; + bufferRecvNew.UnpackJDirSymetric(Vs, KDIR, sVs(KDIR), recvBoxVsKdir); + idefix_for("StoreBufferX2KDIR",kbeg,kend+1,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA ( int k, int j, int i) { - Vs(KDIR,k,jend-(j-jbeg)-1+offset,i) = - sVs(KDIR)*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex ); + assert(Vs(KDIR,k,jend-(j-jbeg)-1+offset,i) == + sVs(KDIR)*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex )); } ); } // MHD } MPI_Wait(&sendRequest, &sendStatus); + MPI_Wait(&sendRequestNew, &sendStatusNew); idfx::mpiCallsTimer += MPI_Wtime() - tStart; @@ -597,6 +714,10 @@ void Axis::InitMPI() { this->bufferRecv = IdefixArray1D("bufferRecvAxis", bufferSize); this->bufferSend = IdefixArray1D("bufferSendAxis", bufferSize); + //build buffers + this->bufferRecvNew = Buffer(bufferSize); + this->bufferSendNew = Buffer(bufferSize); + // init persistent communications // We receive from procRecv, and we send to procSend int procSend, procRecv; @@ -611,6 +732,15 @@ void Axis::InitMPI() { MPI_SAFE_CALL(MPI_Recv_init(bufferRecv.data(), bufferSize, realMPI, procRecv, 650, data->mygrid->AxisComm, &recvRequest)); + assert(bufferSize == bufferSendNew.Size()); + assert(bufferSize == bufferRecvNew.Size()); + + MPI_SAFE_CALL(MPI_Send_init(bufferSendNew.data(), bufferSendNew.Size(), realMPI, procSend, + 1666651, data->mygrid->AxisComm, &sendRequestNew)); + + MPI_SAFE_CALL(MPI_Recv_init(bufferRecvNew.data(), bufferRecvNew.Size(), realMPI, procRecv, + 1666651, data->mygrid->AxisComm, &recvRequestNew)); + #endif idfx::popRegion(); } diff --git a/src/fluid/boundary/axis.hpp b/src/fluid/boundary/axis.hpp index 229c772f6..1cb78504d 100644 --- a/src/fluid/boundary/axis.hpp +++ b/src/fluid/boundary/axis.hpp @@ -11,6 +11,7 @@ #include #include "idefix.hpp" #include "grid.hpp" +#include "buffer.hpp" // Forward class hydro declaration #include "physics.hpp" @@ -58,10 +59,15 @@ class Axis { #ifdef WITH_MPI MPI_Request sendRequest; MPI_Request recvRequest; + MPI_Request sendRequestNew; + MPI_Request recvRequestNew; IdefixArray1D bufferSend; IdefixArray1D bufferRecv; + Buffer bufferSendNew; + Buffer bufferRecvNew; + int bufferSize; IdefixArray1D mapVars; diff --git a/src/mpi/buffer.hpp b/src/mpi/buffer.hpp index ff4dff146..601005663 100644 --- a/src/mpi/buffer.hpp +++ b/src/mpi/buffer.hpp @@ -31,6 +31,10 @@ class Buffer { return(array.data()); } + const IdefixArray1D & getArray(void) const { + return this->array; + } + int Size() { return(array.size()); } @@ -159,6 +163,33 @@ class Buffer { this->pointer += ninjnk; } + void UnpackJDirSymetric(IdefixArray4D& out, + const int var, + const int symMultiplier, + BoundingBox box) { + const int ni = box[IDIR][1]-box[IDIR][0]; + const int ninj = (box[JDIR][1]-box[JDIR][0])*ni; + const int ninjnk = (box[KDIR][1]-box[KDIR][0])*ninj; + const int ibeg = box[IDIR][0]; + const int jbeg = box[JDIR][0]; + const int kbeg = box[KDIR][0]; + const int iend = box[IDIR][1]; + const int jend = box[JDIR][1]; + const int kend = box[KDIR][1]; + const int offset = this->pointer; + + auto arr = this->array; + idefix_for("UnLoadBuffer4D_var",kbeg,kend,jbeg,jend,ibeg,iend, + KOKKOS_LAMBDA (int k, int j, int i) { + const int jinverted = jend-(j-jbeg)-1; + const int arrIndex = i-ibeg + (j-jbeg)*ni + (k-kbeg)*ninj + offset; + out(var,k,jinverted,i) = symMultiplier * arr(arrIndex); + }); + + // Update pointer + this->pointer += ninjnk; + } + void Unpack(IdefixArray4D& out, IdefixArray1D& map, BoundingBox box) { @@ -186,6 +217,36 @@ class Buffer { this->pointer += ninjnk*map.size(); } + void UnpackJDirSymetric(IdefixArray4D& out, + IdefixArray1D& map, + IdefixArray1D& SymMap, + BoundingBox box) { + const int ni = box[IDIR][1]-box[IDIR][0]; + const int ninj = (box[JDIR][1]-box[JDIR][0])*ni; + const int ninjnk = (box[KDIR][1]-box[KDIR][0])*ninj; + const int ibeg = box[IDIR][0]; + const int jbeg = box[JDIR][0]; + const int kbeg = box[KDIR][0]; + const int iend = box[IDIR][1]; + const int jend = box[JDIR][1]; + const int kend = box[KDIR][1]; + const int offset = this->pointer; + + auto arr = this->array; + idefix_for("UnLoadBuffer4D_map",0,map.size(), + kbeg,kend, + jbeg,jend, + ibeg,iend, + KOKKOS_LAMBDA (int n, int k, int j, int i) { + const int jinverted = jend-(j-jbeg)-1; + const int arrIndex = i-ibeg + (j-jbeg)*ni + (k-kbeg)*ninj + n*ninjnk + offset; + out(map(n),k,jinverted,i) = SymMap(map(n)) * arr(arrIndex); + }); + + // Update pointer + this->pointer += ninjnk*map.size(); + } + private: size_t pointer; From da1faf98410b13f02f849078e24acc8a5f17f9b6 Mon Sep 17 00:00:00 2001 From: Sebastien Valat Date: Fri, 19 Jun 2026 13:10:49 +0200 Subject: [PATCH 2/3] refactor: axis communication by using Buffer (step 2 - remove the old code after cross validation) --- src/fluid/boundary/axis.cpp | 174 +++++------------------------------- src/fluid/boundary/axis.hpp | 9 +- 2 files changed, 23 insertions(+), 160 deletions(-) diff --git a/src/fluid/boundary/axis.cpp b/src/fluid/boundary/axis.cpp index da658e6c1..c6402184f 100644 --- a/src/fluid/boundary/axis.cpp +++ b/src/fluid/boundary/axis.cpp @@ -5,11 +5,6 @@ // Licensed under CeCILL 2.1 License, see COPYING for more information // *********************************************************************************** -#undef NDEBUG -#include -#include -#include - #include #include "axis.hpp" #include "boundary.hpp" @@ -399,25 +394,21 @@ void Axis::ExchangeMPI(int side) { // Load the buffers with data int ibeg,iend,jbeg,jend,kbeg,kend,offset; int nx,ny,nz; - auto bufferSend = this->bufferSend; - Buffer bufferSendNew = this->bufferSendNew; + Buffer bufferSend = this->bufferSend; IdefixArray1D map = this->mapVars; IdefixArray4D Vc = this->Vc; IdefixArray4D Vs = this->Vs; //reset pointer - bufferSendNew.ResetPointer(); + bufferSend.ResetPointer(); // If MPI Persistent, start receiving even before the buffers are filled MPI_Status sendStatus; MPI_Status recvStatus; - MPI_Status sendStatusNew; - MPI_Status recvStatusNew; double tStart = MPI_Wtime(); MPI_SAFE_CALL(MPI_Start(&recvRequest)); - MPI_SAFE_CALL(MPI_Start(&recvRequestNew)); idfx::mpiCallsTimer += MPI_Wtime() - tStart; // Coordinates of the ghost region which needs to be transfered @@ -446,63 +437,25 @@ void Axis::ExchangeMPI(int side) { BoundingBox sendBoxVc = baseBox; sendBoxVc[JDIR][0] += ny; sendBoxVc[JDIR][1] += ny; - bufferSendNew.Pack(Vc, map, sendBoxVc); - - idefix_for("LoadBufferX2Vc",0,mapNVars,kbeg,kend,jbeg,jend,ibeg,iend, - KOKKOS_LAMBDA (int n, int k, int j, int i) { - const int storeId = i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz; - bufferSend(storeId ) = - Vc(map(n),k,j+ny,i); - assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); - } - ); + bufferSend.Pack(Vc, map, sendBoxVc); if (haveMHD) { //extend by one BoundingBox sendBoxVsIdir = sendBoxVc; sendBoxVsIdir[IDIR][1] += 1; - bufferSendNew.Pack(Vs, IDIR, sendBoxVsIdir); - - int VsIndex = mapNVars*nx*ny*nz; - idefix_for("LoadBufferX2IDIR",kbeg,kend,jbeg,jend,ibeg,iend+1, - KOKKOS_LAMBDA (int k, int j, int i) { - const int storeId = i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex; - bufferSend(storeId ) = - Vs(IDIR,k,j+ny,i); - assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); - } - ); + bufferSend.Pack(Vs, IDIR, sendBoxVsIdir); //extend by one BoundingBox sendBoxVsKdir = sendBoxVc; sendBoxVsKdir[KDIR][1] += 1; - bufferSendNew.Pack(Vs, KDIR, sendBoxVsKdir); - - VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; - idefix_for("LoadBufferX2KDIR",kbeg,kend+1,jbeg,jend,ibeg,iend, - KOKKOS_LAMBDA (int k, int j, int i) { - const int storeId = i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex; - bufferSend(storeId) = - Vs(KDIR,k,j+ny,i); - assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); - } - ); + bufferSend.Pack(Vs, KDIR, sendBoxVsKdir); } // MHD } else if(side==right) { //shift by offset - NY (to pub on right) BoundingBox sendBoxVc = baseBox; sendBoxVc[JDIR][0] += offset - ny; sendBoxVc[JDIR][1] += offset - ny; - bufferSendNew.Pack(Vc, map, sendBoxVc); - - idefix_for("LoadBufferX2Vc",0,mapNVars,kbeg,kend,jbeg,jend,ibeg,iend, - KOKKOS_LAMBDA (int n, int k, int j, int i) { - const int storeId = i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz; - bufferSend(storeId) = - Vc(map(n),k,j+offset-ny,i); - assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); - } - ); + bufferSend.Pack(Vc, map, sendBoxVc); // Load face-centered field in the buffer if (haveMHD) { @@ -511,67 +464,33 @@ void Axis::ExchangeMPI(int side) { sendBoxVsIdir[IDIR][1] += 1; sendBoxVsIdir[JDIR][0] += offset - ny; sendBoxVsIdir[JDIR][1] += offset - ny; - bufferSendNew.Pack(Vs, IDIR, sendBoxVsIdir); - - int VsIndex = mapNVars*nx*ny*nz; - idefix_for("LoadBufferX2IDIR",kbeg,kend,jbeg,jend,ibeg,iend+1, - KOKKOS_LAMBDA (int k, int j, int i) { - const int storeId = i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex; - bufferSend(storeId) = - Vs(IDIR,k,j+offset-ny,i); - assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); - } - ); + bufferSend.Pack(Vs, IDIR, sendBoxVsIdir); //extend by one BoundingBox sendBoxVsKdir = baseBox; sendBoxVsKdir[KDIR][1] += 1; sendBoxVsKdir[JDIR][0] += offset - ny; sendBoxVsKdir[JDIR][1] += offset - ny; - bufferSendNew.Pack(Vs, KDIR, sendBoxVsKdir); - - VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; - idefix_for("LoadBufferX2KDIR",kbeg,kend+1,jbeg,jend,ibeg,iend, - KOKKOS_LAMBDA (int k, int j, int i) { - const int storeId = i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex; - bufferSend(storeId ) = - Vs(KDIR,k,j+offset-ny,i); - assert(bufferSend(storeId) == bufferSendNew.getArray()(storeId)); - } - ); + bufferSend.Pack(Vs, KDIR, sendBoxVsKdir); } // MHD } // side==right - assert(bufferSendNew.getArray().size() == bufferSend.size()); - Kokkos::fence(); tStart = MPI_Wtime(); MPI_SAFE_CALL(MPI_Start(&sendRequest)); - MPI_SAFE_CALL(MPI_Start(&sendRequestNew)); - MPI_Wait(&recvRequest,&recvStatusNew); - MPI_Wait(&recvRequestNew,&recvStatusNew); + MPI_Wait(&recvRequest,&recvStatus); idfx::mpiCallsTimer += MPI_Wtime() - tStart; // Unpack - auto bufferRecv=this->bufferRecv; - Buffer bufferRecvNew=this->bufferRecvNew; - bufferRecvNew.ResetPointer(); + Buffer bufferRecv=this->bufferRecv; + bufferRecv.ResetPointer(); auto sVc = this->symmetryVc; - assert(bufferRecvNew.getArray().size() == bufferRecv.size()); - if(side==left) { //unpack Vc BoundingBox recvBoxVc = baseBox; - bufferRecvNew.UnpackJDirSymetric(Vc, map, sVc, recvBoxVc); - - idefix_for("StoreBufferAxis",0,mapNVars,kbeg,kend,jbeg,jend,ibeg,iend, - KOKKOS_LAMBDA (int n, int k, int j, int i) { - assert(Vc(map(n),k,jend-(j-jbeg)-1,i) == - sVc(map(n))*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz )); - } - ); + bufferRecv.UnpackJDirSymetric(Vc, map, sVc, recvBoxVc); // Load face-centered field in the buffer if (haveMHD) { @@ -581,42 +500,19 @@ void Axis::ExchangeMPI(int side) { //unpack Vc BoundingBox recvBoxVsIdir = baseBox; recvBoxVsIdir[IDIR][1] += 1; - bufferRecvNew.UnpackJDirSymetric(Vs, IDIR, sVs(IDIR), recvBoxVsIdir); - - idefix_for("StoreBufferX2IDIR",kbeg,kend,jbeg,jend,ibeg,iend+1, - KOKKOS_LAMBDA (int k, int j, int i) { - assert(Vs(IDIR,k,jend-(j-jbeg)-1,i) == - sVs(IDIR)*bufferRecv(i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex )); - } - ); - - VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; + bufferRecv.UnpackJDirSymetric(Vs, IDIR, sVs(IDIR), recvBoxVsIdir); //unpack Vc BoundingBox recvBoxVsKdir = baseBox; recvBoxVsKdir[KDIR][1] += 1; - bufferRecvNew.UnpackJDirSymetric(Vs, KDIR, sVs(KDIR), recvBoxVsKdir); - - idefix_for("StoreBufferX2KDIR",kbeg,kend+1,jbeg,jend,ibeg,iend, - KOKKOS_LAMBDA ( int k, int j, int i) { - assert(Vs(KDIR,k,jend-(j-jbeg)-1,i) == - sVs(KDIR)*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex )); - } - ); + bufferRecv.UnpackJDirSymetric(Vs, KDIR, sVs(KDIR), recvBoxVsKdir); } } else if(side==right) { //unpack Vc BoundingBox recvBoxVc = baseBox; recvBoxVc[JDIR][0] += offset; recvBoxVc[JDIR][1] += offset; - bufferRecvNew.UnpackJDirSymetric(Vc, map, sVc, recvBoxVc); - - idefix_for("StoreBufferAxis",0,mapNVars,kbeg,kend,jbeg,jend,ibeg,iend, - KOKKOS_LAMBDA (int n, int k, int j, int i) { - assert(Vc(map(n),k,jend-(j-jbeg)-1+offset,i) == - sVc(map(n))*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + n*nx*ny*nz )); - } - ); + bufferRecv.UnpackJDirSymetric(Vc, map, sVc, recvBoxVc); // Load face-centered field in the buffer if (haveMHD) { @@ -628,34 +524,18 @@ void Axis::ExchangeMPI(int side) { recvBoxVsIdir[IDIR][1] += 1; recvBoxVsIdir[JDIR][0] += offset; recvBoxVsIdir[JDIR][1] += offset; - bufferRecvNew.UnpackJDirSymetric(Vs, IDIR, sVs(IDIR), recvBoxVsIdir); - - idefix_for("StoreBufferX2IDIR",kbeg,kend,jbeg,jend,ibeg,iend+1, - KOKKOS_LAMBDA (int k, int j, int i) { - assert(Vs(IDIR,k,jend-(j-jbeg)-1+offset,i) == - sVs(IDIR)*bufferRecv(i + (j-jbeg)*(nx+1) + (k-kbeg)*(nx+1)*ny + VsIndex )); - } - ); - VsIndex = mapNVars*nx*ny*nz + (nx+1)*ny*nz; + bufferRecv.UnpackJDirSymetric(Vs, IDIR, sVs(IDIR), recvBoxVsIdir); //unpack Vc BoundingBox recvBoxVsKdir = baseBox; recvBoxVsKdir[KDIR][1] += 1; recvBoxVsKdir[JDIR][0] += offset; recvBoxVsKdir[JDIR][1] += offset; - bufferRecvNew.UnpackJDirSymetric(Vs, KDIR, sVs(KDIR), recvBoxVsKdir); - - idefix_for("StoreBufferX2KDIR",kbeg,kend+1,jbeg,jend,ibeg,iend, - KOKKOS_LAMBDA ( int k, int j, int i) { - assert(Vs(KDIR,k,jend-(j-jbeg)-1+offset,i) == - sVs(KDIR)*bufferRecv(i + (j-jbeg)*nx + (k-kbeg)*nx*ny + VsIndex )); - } - ); + bufferRecv.UnpackJDirSymetric(Vs, KDIR, sVs(KDIR), recvBoxVsKdir); } // MHD } MPI_Wait(&sendRequest, &sendStatus); - MPI_Wait(&sendRequestNew, &sendStatusNew); idfx::mpiCallsTimer += MPI_Wtime() - tStart; @@ -711,12 +591,9 @@ void Axis::InitMPI() { #endif // DIMENSIONS } - this->bufferRecv = IdefixArray1D("bufferRecvAxis", bufferSize); - this->bufferSend = IdefixArray1D("bufferSendAxis", bufferSize); - //build buffers - this->bufferRecvNew = Buffer(bufferSize); - this->bufferSendNew = Buffer(bufferSize); + this->bufferRecv = Buffer(bufferSize); + this->bufferSend = Buffer(bufferSize); // init persistent communications // We receive from procRecv, and we send to procSend @@ -726,21 +603,12 @@ void Axis::InitMPI() { MPI_SAFE_CALL(MPI_Cart_shift(data->mygrid->AxisComm,0,data->mygrid->nproc[KDIR]/2, &procRecv,&procSend )); - MPI_SAFE_CALL(MPI_Send_init(bufferSend.data(), bufferSize, realMPI, procSend, + MPI_SAFE_CALL(MPI_Send_init(bufferSend.data(), bufferSend.Size(), realMPI, procSend, 650, data->mygrid->AxisComm, &sendRequest)); - MPI_SAFE_CALL(MPI_Recv_init(bufferRecv.data(), bufferSize, realMPI, procRecv, + MPI_SAFE_CALL(MPI_Recv_init(bufferRecv.data(), bufferRecv.Size(), realMPI, procRecv, 650, data->mygrid->AxisComm, &recvRequest)); - assert(bufferSize == bufferSendNew.Size()); - assert(bufferSize == bufferRecvNew.Size()); - - MPI_SAFE_CALL(MPI_Send_init(bufferSendNew.data(), bufferSendNew.Size(), realMPI, procSend, - 1666651, data->mygrid->AxisComm, &sendRequestNew)); - - MPI_SAFE_CALL(MPI_Recv_init(bufferRecvNew.data(), bufferRecvNew.Size(), realMPI, procRecv, - 1666651, data->mygrid->AxisComm, &recvRequestNew)); - #endif idfx::popRegion(); } diff --git a/src/fluid/boundary/axis.hpp b/src/fluid/boundary/axis.hpp index 1cb78504d..390a628ce 100644 --- a/src/fluid/boundary/axis.hpp +++ b/src/fluid/boundary/axis.hpp @@ -59,14 +59,9 @@ class Axis { #ifdef WITH_MPI MPI_Request sendRequest; MPI_Request recvRequest; - MPI_Request sendRequestNew; - MPI_Request recvRequestNew; - IdefixArray1D bufferSend; - IdefixArray1D bufferRecv; - - Buffer bufferSendNew; - Buffer bufferRecvNew; + Buffer bufferSend; + Buffer bufferRecv; int bufferSize; From b8ea3ff62bb051ce1d117d7f21565c66212b4b4c Mon Sep 17 00:00:00 2001 From: Sebastien Valat Date: Fri, 19 Jun 2026 13:56:27 +0200 Subject: [PATCH 3/3] refactor: use better comments + give uniq name to the idefix_for new kernels --- src/fluid/boundary/axis.cpp | 22 +++++++++++----------- src/mpi/buffer.hpp | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/fluid/boundary/axis.cpp b/src/fluid/boundary/axis.cpp index c6402184f..a67621934 100644 --- a/src/fluid/boundary/axis.cpp +++ b/src/fluid/boundary/axis.cpp @@ -423,7 +423,7 @@ void Axis::ExchangeMPI(int side) { kend = data->end[KDIR]; nz = kend - kbeg; - // Create the box + // Create the base box to be patched by the ops BoundingBox baseBox; baseBox[IDIR][0] = ibeg; baseBox[IDIR][1] = iend; @@ -440,18 +440,18 @@ void Axis::ExchangeMPI(int side) { bufferSend.Pack(Vc, map, sendBoxVc); if (haveMHD) { - //extend by one + //extend by one the end on idir BoundingBox sendBoxVsIdir = sendBoxVc; sendBoxVsIdir[IDIR][1] += 1; bufferSend.Pack(Vs, IDIR, sendBoxVsIdir); - //extend by one + //extend by one the end on kdir BoundingBox sendBoxVsKdir = sendBoxVc; sendBoxVsKdir[KDIR][1] += 1; bufferSend.Pack(Vs, KDIR, sendBoxVsKdir); } // MHD } else if(side==right) { - //shift by offset - NY (to pub on right) + //shift by offset - NY (to select the right part) BoundingBox sendBoxVc = baseBox; sendBoxVc[JDIR][0] += offset - ny; sendBoxVc[JDIR][1] += offset - ny; @@ -459,14 +459,14 @@ void Axis::ExchangeMPI(int side) { // Load face-centered field in the buffer if (haveMHD) { - //extend by one + //extend by one the end on idir + take the right part or the mesh on jdir BoundingBox sendBoxVsIdir = baseBox; sendBoxVsIdir[IDIR][1] += 1; sendBoxVsIdir[JDIR][0] += offset - ny; sendBoxVsIdir[JDIR][1] += offset - ny; bufferSend.Pack(Vs, IDIR, sendBoxVsIdir); - //extend by one + //extend by one the end on kdir + take the right part or the mesh on jdir BoundingBox sendBoxVsKdir = baseBox; sendBoxVsKdir[KDIR][1] += 1; sendBoxVsKdir[JDIR][0] += offset - ny; @@ -497,18 +497,18 @@ void Axis::ExchangeMPI(int side) { int VsIndex = mapNVars*nx*ny*nz; auto sVs = this->symmetryVs; - //unpack Vc + //unpack Vs face-centered BoundingBox recvBoxVsIdir = baseBox; recvBoxVsIdir[IDIR][1] += 1; bufferRecv.UnpackJDirSymetric(Vs, IDIR, sVs(IDIR), recvBoxVsIdir); - //unpack Vc + //unpack Vs face-centered BoundingBox recvBoxVsKdir = baseBox; recvBoxVsKdir[KDIR][1] += 1; bufferRecv.UnpackJDirSymetric(Vs, KDIR, sVs(KDIR), recvBoxVsKdir); } } else if(side==right) { - //unpack Vc + //unpack Vc on right part BoundingBox recvBoxVc = baseBox; recvBoxVc[JDIR][0] += offset; recvBoxVc[JDIR][1] += offset; @@ -519,14 +519,14 @@ void Axis::ExchangeMPI(int side) { int VsIndex = mapNVars*nx*ny*nz; auto sVs = this->symmetryVs; - //unpack Vc + //unpack Vs face-centered on right part BoundingBox recvBoxVsIdir = baseBox; recvBoxVsIdir[IDIR][1] += 1; recvBoxVsIdir[JDIR][0] += offset; recvBoxVsIdir[JDIR][1] += offset; bufferRecv.UnpackJDirSymetric(Vs, IDIR, sVs(IDIR), recvBoxVsIdir); - //unpack Vc + //unpack Vs face-centered on right part BoundingBox recvBoxVsKdir = baseBox; recvBoxVsKdir[KDIR][1] += 1; recvBoxVsKdir[JDIR][0] += offset; diff --git a/src/mpi/buffer.hpp b/src/mpi/buffer.hpp index 601005663..35164355b 100644 --- a/src/mpi/buffer.hpp +++ b/src/mpi/buffer.hpp @@ -179,7 +179,7 @@ class Buffer { const int offset = this->pointer; auto arr = this->array; - idefix_for("UnLoadBuffer4D_var",kbeg,kend,jbeg,jend,ibeg,iend, + idefix_for("UnLoadBuffer4D_var_sym",kbeg,kend,jbeg,jend,ibeg,iend, KOKKOS_LAMBDA (int k, int j, int i) { const int jinverted = jend-(j-jbeg)-1; const int arrIndex = i-ibeg + (j-jbeg)*ni + (k-kbeg)*ninj + offset; @@ -233,7 +233,7 @@ class Buffer { const int offset = this->pointer; auto arr = this->array; - idefix_for("UnLoadBuffer4D_map",0,map.size(), + idefix_for("UnLoadBuffer4D_map_sym",0,map.size(), kbeg,kend, jbeg,jend, ibeg,iend,