From a9511bb8512363c7386ccc3e06aed6255ba441c7 Mon Sep 17 00:00:00 2001 From: Martin Khannouz <martin.khannouz@inria.fr> Date: Wed, 6 Apr 2016 08:39:28 +0200 Subject: [PATCH] Symetrize P2P in implicit version. Still have to fix memory leak, but it works. --- .../FGroupTaskStarpuImplicitAlgorithm.hpp | 171 +++++++++--------- Tests/GroupTree/compareDAGmapping.cpp | 4 - 2 files changed, 88 insertions(+), 87 deletions(-) diff --git a/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp b/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp index d3df91b3c..ad98e3c70 100644 --- a/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp +++ b/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp @@ -41,7 +41,7 @@ #include "../OpenCl/FOpenCLDeviceWrapper.hpp" #endif -//#define SCALFMM_SIMGRID_TASKNAMEPARAMS +#define SCALFMM_SIMGRID_TASKNAMEPARAMS #ifdef SCALFMM_SIMGRID_TASKNAMEPARAMS #include "../StarPUUtils/FStarPUTaskNameParams.hpp" #endif @@ -435,6 +435,10 @@ public: } } } + int getOppositeInterIndex(const int index) const { + // ((( (xdiff+3) * 7) + (ydiff+3))) * 7 + zdiff + 3 + return 343-index-1; + } protected: /** * Runs the complete algorithm. @@ -1580,8 +1584,8 @@ protected: for(int idxInteraction = 0; idxInteraction < int(externalInteractionsLeafLevel[idxGroup].size()) ; ++idxInteraction){ const int interactionid = externalInteractionsLeafLevel[idxGroup][idxInteraction].otherBlockId; const std::vector<OutOfBlockInteraction>* outsideInteractions = &externalInteractionsLeafLevel[idxGroup][idxInteraction].interactions; - //if(starpu_mpi_data_get_rank(particleHandles[idxGroup].down) == starpu_mpi_data_get_rank(particleHandles[interactionid].down)) - //{ + if(starpu_mpi_data_get_rank(particleHandles[idxGroup].down) == starpu_mpi_data_get_rank(particleHandles[interactionid].down)) + { starpu_mpi_insert_task(MPI_COMM_WORLD, &p2p_cl_inout, STARPU_VALUE, &wrapperptr, sizeof(wrapperptr), @@ -1624,86 +1628,87 @@ protected: #endif #endif 0); - //} - //else - //{ - //starpu_mpi_insert_task(MPI_COMM_WORLD, - //&p2p_cl_inout_mpi, - //STARPU_VALUE, &wrapperptr, sizeof(wrapperptr), - //STARPU_VALUE, &outsideInteractions, sizeof(outsideInteractions), - //STARPU_VALUE, &particleHandles[idxGroup].intervalSize, sizeof(int), - //#ifdef SCALFMM_STARPU_USE_PRIO - //STARPU_PRIORITY, PrioClass::Controller().getInsertionPosP2PExtern(), - //#endif - //STARPU_R, particleHandles[idxGroup].symb, - //(STARPU_RW|STARPU_COMMUTE_IF_SUPPORTED), particleHandles[idxGroup].down, - //STARPU_R, particleHandles[interactionid].symb, - //#ifdef STARPU_USE_TASK_NAME - //#ifndef SCALFMM_SIMGRID_TASKNAMEPARAMS - //STARPU_NAME, p2pOuterTaskNames.get(), - //#else - ////"P2P_out-nb_i_p_nb_i_p_s" - //STARPU_NAME, taskNames->print("P2P_out", "%d, %lld, %lld, %d, %lld, %lld, %d, %lld, %lld, %lld, %lld, %d\n", - //tree->getParticleGroup(idxGroup)->getNumberOfLeavesInBlock(), - //tree->getParticleGroup(idxGroup)->getSizeOfInterval(), - //tree->getParticleGroup(idxGroup)->getNbParticlesInGroup(), - //tree->getParticleGroup(interactionid)->getNumberOfLeavesInBlock(), - //tree->getParticleGroup(interactionid)->getSizeOfInterval(), - //tree->getParticleGroup(interactionid)->getNbParticlesInGroup(), - //outsideInteractions->size(), - //tree->getParticleGroup(idxGroup)->getStartingIndex(), - //tree->getParticleGroup(idxGroup)->getEndingIndex(), - //tree->getParticleGroup(interactionid)->getStartingIndex(), - //tree->getParticleGroup(interactionid)->getEndingIndex(), - //starpu_mpi_data_get_rank(particleHandles[idxGroup].down)), - //#endif - //#endif - //0); - //std::vector<OutOfBlockInteraction> outsideInteractions_2 = externalInteractionsLeafLevel[idxGroup][idxInteraction].interactions; - //for(int i = 0; i < outsideInteractions_2.size(); ++i) - //{ - //MortonIndex tmp = outsideInteractions_2[i].outIndex; - //outsideInteractions_2[i].outIndex = outsideInteractions_2[i].insideIndex; - //outsideInteractions_2[i].insideIndex = tmp; - //int tmp2 = outsideInteractions_2[i].insideIdxInBlock; - //outsideInteractions_2[i].insideIdxInBlock = outsideInteractions_2[i].outsideIdxInBlock; - //outsideInteractions_2[i].outsideIdxInBlock = tmp2; - //outsideInteractions_2[i].relativeOutPosition = getOppositeInterIndex(outsideInteractions_2[i].relativeOutPosition); - //} - //auto c = &outsideInteractions_2; - //starpu_mpi_insert_task(MPI_COMM_WORLD, - //&p2p_cl_inout_mpi, - //STARPU_VALUE, &wrapperptr, sizeof(wrapperptr), - //STARPU_VALUE, &outsideInteractions, sizeof(outsideInteractions), - //STARPU_VALUE, &particleHandles[idxGroup].intervalSize, sizeof(int), - //#ifdef SCALFMM_STARPU_USE_PRIO - //STARPU_PRIORITY, PrioClass::Controller().getInsertionPosP2PExtern(), - //#endif - //STARPU_R, particleHandles[interactionid].symb, - //(STARPU_RW|STARPU_COMMUTE_IF_SUPPORTED), particleHandles[interactionid].down, - //STARPU_R, particleHandles[idxGroup].symb, - //#ifdef STARPU_USE_TASK_NAME - //#ifndef SCALFMM_SIMGRID_TASKNAMEPARAMS - //STARPU_NAME, p2pOuterTaskNames.get(), - //#else - ////"P2P_out-nb_i_p_nb_i_p_s" - //STARPU_NAME, taskNames->print("P2P_out", "%d, %lld, %lld, %d, %lld, %lld, %d, %lld, %lld, %lld, %lld, %d\n", - //tree->getParticleGroup(interactionid)->getNumberOfLeavesInBlock(), - //tree->getParticleGroup(interactionid)->getSizeOfInterval(), - //tree->getParticleGroup(interactionid)->getNbParticlesInGroup(), - //tree->getParticleGroup(idxGroup)->getNumberOfLeavesInBlock(), - //tree->getParticleGroup(idxGroup)->getSizeOfInterval(), - //tree->getParticleGroup(idxGroup)->getNbParticlesInGroup(), - //outsideInteractions->size(), - //tree->getParticleGroup(interactionid)->getStartingIndex(), - //tree->getParticleGroup(interactionid)->getEndingIndex(), - //tree->getParticleGroup(idxGroup)->getStartingIndex(), - //tree->getParticleGroup(idxGroup)->getEndingIndex(), - //starpu_mpi_data_get_rank(particleHandles[interactionid].down)), - //#endif - //#endif - //0); - //} + } + else + { + starpu_mpi_insert_task(MPI_COMM_WORLD, + &p2p_cl_inout_mpi, + STARPU_VALUE, &wrapperptr, sizeof(wrapperptr), + STARPU_VALUE, &outsideInteractions, sizeof(outsideInteractions), + STARPU_VALUE, &particleHandles[idxGroup].intervalSize, sizeof(int), + #ifdef SCALFMM_STARPU_USE_PRIO + STARPU_PRIORITY, PrioClass::Controller().getInsertionPosP2PExtern(), + #endif + STARPU_R, particleHandles[idxGroup].symb, + (STARPU_RW|STARPU_COMMUTE_IF_SUPPORTED), particleHandles[idxGroup].down, + STARPU_R, particleHandles[interactionid].symb, + #ifdef STARPU_USE_TASK_NAME + #ifndef SCALFMM_SIMGRID_TASKNAMEPARAMS + STARPU_NAME, p2pOuterTaskNames.get(), + #else + //"P2P_out-nb_i_p_nb_i_p_s" + STARPU_NAME, taskNames->print("P2P_out", "%d, %lld, %lld, %d, %lld, %lld, %d, %lld, %lld, %lld, %lld, %d\n", + tree->getParticleGroup(idxGroup)->getNumberOfLeavesInBlock(), + tree->getParticleGroup(idxGroup)->getSizeOfInterval(), + tree->getParticleGroup(idxGroup)->getNbParticlesInGroup(), + tree->getParticleGroup(interactionid)->getNumberOfLeavesInBlock(), + tree->getParticleGroup(interactionid)->getSizeOfInterval(), + tree->getParticleGroup(interactionid)->getNbParticlesInGroup(), + outsideInteractions->size(), + tree->getParticleGroup(idxGroup)->getStartingIndex(), + tree->getParticleGroup(idxGroup)->getEndingIndex(), + tree->getParticleGroup(interactionid)->getStartingIndex(), + tree->getParticleGroup(interactionid)->getEndingIndex(), + starpu_mpi_data_get_rank(particleHandles[idxGroup].down)), + #endif + #endif + 0); + std::vector<OutOfBlockInteraction> outsideInteractions_2 = externalInteractionsLeafLevel[idxGroup][idxInteraction].interactions; + for(int i = 0; i < outsideInteractions_2.size(); ++i) + { + MortonIndex tmp = outsideInteractions_2[i].outIndex; + outsideInteractions_2[i].outIndex = outsideInteractions_2[i].insideIndex; + outsideInteractions_2[i].insideIndex = tmp; + int tmp2 = outsideInteractions_2[i].insideIdxInBlock; + outsideInteractions_2[i].insideIdxInBlock = outsideInteractions_2[i].outsideIdxInBlock; + outsideInteractions_2[i].outsideIdxInBlock = tmp2; + outsideInteractions_2[i].relativeOutPosition = getOppositeInterIndex(outsideInteractions_2[i].relativeOutPosition); + } + //TODO delete when done in the destructor + std::vector<OutOfBlockInteraction>* c = new std::vector<OutOfBlockInteraction>(outsideInteractions_2); + starpu_mpi_insert_task(MPI_COMM_WORLD, + &p2p_cl_inout_mpi, + STARPU_VALUE, &wrapperptr, sizeof(wrapperptr), + STARPU_VALUE, &c, sizeof(c), + STARPU_VALUE, &particleHandles[idxGroup].intervalSize, sizeof(int), + #ifdef SCALFMM_STARPU_USE_PRIO + STARPU_PRIORITY, PrioClass::Controller().getInsertionPosP2PExtern(), + #endif + STARPU_R, particleHandles[interactionid].symb, + (STARPU_RW|STARPU_COMMUTE_IF_SUPPORTED), particleHandles[interactionid].down, + STARPU_R, particleHandles[idxGroup].symb, + #ifdef STARPU_USE_TASK_NAME + #ifndef SCALFMM_SIMGRID_TASKNAMEPARAMS + STARPU_NAME, p2pOuterTaskNames.get(), + #else + //"P2P_out-nb_i_p_nb_i_p_s" + STARPU_NAME, taskNames->print("P2P_out", "%d, %lld, %lld, %d, %lld, %lld, %d, %lld, %lld, %lld, %lld, %d\n", + tree->getParticleGroup(interactionid)->getNumberOfLeavesInBlock(), + tree->getParticleGroup(interactionid)->getSizeOfInterval(), + tree->getParticleGroup(interactionid)->getNbParticlesInGroup(), + tree->getParticleGroup(idxGroup)->getNumberOfLeavesInBlock(), + tree->getParticleGroup(idxGroup)->getSizeOfInterval(), + tree->getParticleGroup(idxGroup)->getNbParticlesInGroup(), + outsideInteractions->size(), + tree->getParticleGroup(interactionid)->getStartingIndex(), + tree->getParticleGroup(interactionid)->getEndingIndex(), + tree->getParticleGroup(idxGroup)->getStartingIndex(), + tree->getParticleGroup(idxGroup)->getEndingIndex(), + starpu_mpi_data_get_rank(particleHandles[interactionid].down)), + #endif + #endif + 0); + } } } FLOG( timerOutBlock.tac() ); diff --git a/Tests/GroupTree/compareDAGmapping.cpp b/Tests/GroupTree/compareDAGmapping.cpp index 898c44332..037b47d14 100644 --- a/Tests/GroupTree/compareDAGmapping.cpp +++ b/Tests/GroupTree/compareDAGmapping.cpp @@ -29,10 +29,6 @@ struct Task { if(type != other.type || id.size() != other.id.size()) return false; - if(type == P2P_OUT) //Symétrisation - if(id[0] == other.id[2] && id[1] == other.id[3] && id[2] == other.id[0] && id[3] == other.id[1]) - return true; - for(size_t i = 0; i < id.size(); ++i) if(id[i] != other.id[i]) return false; -- GitLab