diff --git a/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp b/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp index 5f6ed86ef53a4083374807aff33fa6f5f6222898..09c92becab9165a123b1941b509a985a634ad48b 100644 --- a/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp +++ b/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp @@ -203,6 +203,9 @@ protected: starpu_data_handle_t other; size_t sizeOther; unsigned char* dataOther; // Never delete it, we reuse already allocate memory here + + std::unique_ptr<unsigned char[]> dataSymbPtr; + std::unique_ptr<unsigned char[]> dataOtherPtr; }; std::list<DuplicatedCellHandle> duplicatedCellBuffer; @@ -240,7 +243,7 @@ public: MPI_Comm_rank(MPI_COMM_WORLD,&mpi_rank); MPI_Comm_size(MPI_COMM_WORLD,&nproc); #ifdef STARPU_USE_TASK_NAME -#ifdef SCALFMM_SIMGRID_TASKNAMEPARAMS +#ifdef SCALFMM_SIMGRID_TASKNAMEPARAMS taskNames = new FStarPUTaskNameParams(mpi_rank, nproc); #endif #endif @@ -1632,7 +1635,7 @@ protected: DuplicatedCellHandle& duplicateB = duplicatedCellBuffer.back(); duplicateB.sizeSymb = tree->getCellGroup(idxLevel,interactionid)->getBufferSizeInByte(); duplicateB.sizeOther = tree->getCellGroup(idxLevel,interactionid)->getMultipoleBufferSizeInByte(); - if(starpu_mpi_data_get_rank(cellHandles[idxLevel][idxGroup].down) == mpi_rank){ + if(starpu_mpi_data_get_rank(cellHandles[idxLevel][idxGroup].symb) == mpi_rank){ // Reuse block but just to perform the send duplicateB.dataSymb = const_cast<unsigned char*>(tree->getCellGroup(idxLevel,interactionid)->getRawBuffer()); duplicateB.dataOther = reinterpret_cast<unsigned char*>(tree->getCellGroup(idxLevel,interactionid)->getRawMultipoleBuffer()); @@ -1641,7 +1644,7 @@ protected: duplicateB.dataSymb = nullptr; duplicateB.dataOther = nullptr; } - registeringNode = starpu_mpi_data_get_rank(cellHandles[idxLevel][idxGroup].down); + registeringNode = starpu_mpi_data_get_rank(cellHandles[idxLevel][idxGroup].symb); where = (registeringNode == mpi_rank) ? STARPU_MAIN_RAM : -1; starpu_variable_data_register(&duplicateB.symb, where, (uintptr_t)duplicateB.dataSymb, duplicateB.sizeSymb); @@ -1734,22 +1737,23 @@ protected: DuplicatedCellHandle& duplicateB = duplicatedCellBuffer.back(); duplicateB.sizeSymb = tree->getCellGroup(idxLevel,idxGroup)->getBufferSizeInByte(); duplicateB.sizeOther = tree->getCellGroup(idxLevel,idxGroup)->getMultipoleBufferSizeInByte(); - if(starpu_mpi_data_get_rank(cellHandles[idxLevel][interactionid].down) == mpi_rank){ + if(starpu_mpi_data_get_rank(cellHandles[idxLevel][interactionid].symb) == mpi_rank){ // Reuse block but just to perform the send - duplicateB.dataSymb = const_cast<unsigned char*>(tree->getCellGroup(idxLevel,idxGroup)->getRawBuffer()); - duplicateB.dataOther = reinterpret_cast<unsigned char*>(tree->getCellGroup(idxLevel,idxGroup)->getRawMultipoleBuffer()); + duplicateB.dataSymbPtr.reset(new unsigned char[duplicateB.sizeSymb]);//const_cast<unsigned char*>(tree->getCellGroup(idxLevel,idxGroup)->getRawBuffer()); + memcpy(duplicateB.dataSymbPtr.get(), tree->getCellGroup(idxLevel,idxGroup)->getRawBuffer(), duplicateB.sizeSymb); + duplicateB.dataOtherPtr.reset(new unsigned char[duplicateB.sizeOther]);//reinterpret_cast<unsigned char*>(tree->getCellGroup(idxLevel,idxGroup)->getRawMultipoleBuffer()); + memcpy(duplicateB.dataOtherPtr.get(), tree->getCellGroup(idxLevel,idxGroup)->getRawMultipoleBuffer(), duplicateB.sizeOther); } - else{ - duplicateB.dataSymb = nullptr; - duplicateB.dataOther = nullptr; - } - registeringNode = starpu_mpi_data_get_rank(cellHandles[idxLevel][interactionid].down); + duplicateB.dataSymb = nullptr; + duplicateB.dataOther = nullptr; + + registeringNode = starpu_mpi_data_get_rank(cellHandles[idxLevel][interactionid].symb); where = (registeringNode == mpi_rank) ? STARPU_MAIN_RAM : -1; starpu_variable_data_register(&duplicateB.symb, where, - (uintptr_t)duplicateB.dataSymb, duplicateB.sizeSymb); + (uintptr_t)duplicateB.dataSymbPtr.get(), duplicateB.sizeSymb); starpu_mpi_data_register(duplicateB.symb, tag++, registeringNode); starpu_variable_data_register(&duplicateB.other, where, - (uintptr_t)duplicateB.dataOther, duplicateB.sizeOther); + (uintptr_t)duplicateB.dataOtherPtr.get(), duplicateB.sizeOther); starpu_mpi_data_register(duplicateB.other, tag++, registeringNode); starpu_mpi_insert_task(MPI_COMM_WORLD,