
00001 // #ifdef filippo 00002 00003 // #include "MPIStrategy.h" 00004 00005 // #if CHARM_MPI 00006 // MPI_Comm groupComm; 00007 // MPI_Group group, groupWorld; 00008 // #endif 00009 00010 // MPIStrategy::MPIStrategy() { 00011 // messageBuf = NULL; 00012 // messageCount = 0; 00013 // npes = CkNumPes(); 00014 // pelist = NULL; 00015 // } 00016 00017 // MPIStrategy::MPIStrategy(int npes, int *pelist) { 00018 // messageBuf = NULL; 00019 // messageCount = 0; 00020 00021 // this->npes = npes; 00022 // this->pelist = pelist; 00023 // } 00024 00025 // void MPIStrategy::insertMessage(CharmMessageHolder *cmsg){ 00026 // cmsg->next = messageBuf; 00027 // messageBuf = cmsg; 00028 // } 00029 00030 // void MPIStrategy::doneInserting(){ 00031 // #if CHARM_MPI 00032 // ComlibPrintf("[%d] In MPI strategy\n", CkMyPe()); 00033 00034 // CharmMessageHolder *cmsg = messageBuf; 00035 // char *buf_ptr = mpi_sndbuf; 00036 00037 // //if(npes == 0) 00038 // // npes = CkNumPes(); 00039 00040 // for(count = 0; count < npes; count ++) { 00041 // ((int *)buf_ptr)[0] = 0; 00042 // buf_ptr += MPI_MAX_MSG_SIZE; 00043 // } 00044 00045 // buf_ptr = mpi_sndbuf; 00046 // for(count = 0; count < messageCount; count ++) { 00047 // if(npes < CkNumPes()) { 00048 // ComlibPrintf("[%d] Copying data to %d and rank %d\n", 00049 // cmsg->dest_proc, procMap[cmsg->dest_proc]); 00050 // buf_ptr = mpi_sndbuf + MPI_MAX_MSG_SIZE * procMap[cmsg->dest_proc]; 00051 // } 00052 // else 00053 // buf_ptr = mpi_sndbuf + MPI_MAX_MSG_SIZE * cmsg->dest_proc; 00054 00055 // char * msg = cmsg->getCharmMessage(); 00056 // envelope * env = UsrToEnv(msg); 00057 00058 // ((int *)buf_ptr)[0] = env->getTotalsize(); 00059 00060 // ComlibPrintf("[%d] Copying message\n", CkMyPe()); 00061 // memcpy(buf_ptr + sizeof(int), (char *)env, env->getTotalsize()); 00062 00063 // ComlibPrintf("[%d] Deleting message\n", CkMyPe()); 00064 // CmiFree((char *) env); 00065 // CharmMessageHolder *prev = cmsg; 00066 // cmsg = cmsg->next; 00067 // delete prev; 00068 // } 00069 00070 // //ComlibPrintf("[%d] Calling Barrier\n", CkMyPe()); 00071 // //PMPI_Barrier(groupComm); 00072 00073 // ComlibPrintf("[%d] Calling All to all\n", CkMyPe()); 00074 // MPI_Alltoall(mpi_sndbuf, MPI_MAX_MSG_SIZE, MPI_CHAR, mpi_recvbuf, 00075 // MPI_MAX_MSG_SIZE, MPI_CHAR, groupComm); 00076 00077 // ComlibPrintf("[%d] All to all finished\n", CkMyPe()); 00078 // buf_ptr = mpi_recvbuf; 00079 // for(count = 0; count < npes; count ++) { 00080 // int recv_msg_size = ((int *)buf_ptr)[0]; 00081 // char * recv_msg = buf_ptr + sizeof(int); 00082 00083 // if((recv_msg_size > 0) && recv_msg_size < MPI_MAX_MSG_SIZE) { 00084 // ComlibPrintf("[%d] Receiving message of size %d\n", CkMyPe(), 00085 // recv_msg_size); 00086 // CmiSyncSend(CkMyPe(), recv_msg_size, recv_msg); 00087 // } 00088 // buf_ptr += MPI_MAX_MSG_SIZE; 00089 // } 00090 // #endif 00091 // } 00092 00093 // void MPIStrategy::pup(PUP::er &p) { 00094 // CharmStrategy::pup(p); 00095 00096 // p | messageCount; 00097 // p | npes; 00098 00099 // if(p.isUnpacking()) 00100 // pelist = new int[npes]; 00101 // p(pelist , npes); 00102 00103 // messageBuf = NULL; 00104 00105 // if(p.isUnpacking()){ 00106 // #if CHARM_MPI 00107 // if(npes < CkNumPes()){ 00108 // MPI_Comm_group(MPI_COMM_WORLD, &groupWorld); 00109 // MPI_Group_incl(groupWorld, npes, pelist, &group); 00110 // MPI_Comm_create(MPI_COMM_WORLD, group, &groupComm); 00111 // } 00112 // else groupComm = MPI_COMM_WORLD; 00113 // #endif 00114 // } 00115 // } 00116 00117 // //PUPable_def(MPIStrategy); 00118 00119 // #endif
1.5.5