m->mothurOut("Reading in the " + fastaFileName + " template sequences...\t"); cout.flush();\r
\r
#ifdef USE_MPI \r
- int pid;\r
- vector<long> positions;\r
+ int pid, processors;\r
+ vector<unsigned long int> positions;\r
\r
MPI_Status status; \r
MPI_File inMPI;\r
MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are\r
+ MPI_Comm_size(MPI_COMM_WORLD, &processors);\r
+ int tag = 2001;\r
\r
char inFileName[1024];\r
strcpy(inFileName, fastaFileName.c_str());\r
positions = setFilePosFasta(fastaFileName, numSeqs); //fills MPIPos, returns numSeqs\r
\r
//send file positions to all processes\r
- MPI_Bcast(&numSeqs, 1, MPI_INT, 0, MPI_COMM_WORLD); //send numSeqs\r
- MPI_Bcast(&positions[0], (numSeqs+1), MPI_LONG, 0, MPI_COMM_WORLD); //send file pos \r
+ for(int i = 1; i < processors; i++) { \r
+ MPI_Send(&numSeqs, 1, MPI_INT, i, tag, MPI_COMM_WORLD);\r
+ MPI_Send(&positions[0], (numSeqs+1), MPI_LONG, i, tag, MPI_COMM_WORLD);\r
+ }\r
}else{\r
- MPI_Bcast(&numSeqs, 1, MPI_INT, 0, MPI_COMM_WORLD); //get numSeqs\r
+ MPI_Recv(&numSeqs, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);\r
positions.resize(numSeqs+1);\r
- MPI_Bcast(&positions[0], (numSeqs+1), MPI_LONG, 0, MPI_COMM_WORLD); //get file positions\r
+ MPI_Recv(&positions[0], (numSeqs+1), MPI_LONG, 0, tag, MPI_COMM_WORLD, &status);\r
}\r
\r
//read file \r
if (temp.getUnaligned().length() > longest) { longest = temp.getUnaligned().length()+1; }\r
}\r
}\r
- \r
+ \r
+ MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case\r
+ \r
MPI_File_close(&inMPI);\r
\r
#else\r
exit(1);\r
}\r
}\r
-#ifdef USE_MPI \r
-/**************************************************************************************************/\r
-int AlignmentDB::MPISend(int receiver) {\r
- try {\r
- \r
- //send numSeqs - int\r
- MPI_Send(&numSeqs, 1, MPI_INT, receiver, 2001, MPI_COMM_WORLD); \r
- \r
- //send longest - int\r
- MPI_Send(&longest, 1, MPI_INT, receiver, 2001, MPI_COMM_WORLD); \r
- \r
- //send templateSequences\r
- for (int i = 0; i < templateSequences.size(); i++) {\r
- templateSequences[i].MPISend(receiver);\r
- }\r
- \r
- //send Database\r
- search->MPISend(receiver);\r
- \r
- return 0;\r
- }\r
- catch(exception& e) {\r
- m->errorOut(e, "AlignmentDB", "MPISend");\r
- exit(1);\r
- }\r
-}\r
-/**************************************************************************************************/\r
-int AlignmentDB::MPIRecv(int sender) {\r
- try {\r
- MPI_Status status;\r
- //receive numSeqs - int\r
- MPI_Recv(&numSeqs, 1, MPI_INT, sender, 2001, MPI_COMM_WORLD, &status);\r
- \r
- //receive longest - int\r
- MPI_Recv(&longest, 1, MPI_INT, sender, 2001, MPI_COMM_WORLD, &status);\r
-\r
- //receive templateSequences\r
- templateSequences.resize(numSeqs);\r
- for (int i = 0; i < templateSequences.size(); i++) {\r
- templateSequences[i].MPIRecv(sender);\r
- }\r
-\r
- //receive Database\r
- search->MPIRecv(sender);\r
- \r
- for (int i = 0; i < templateSequences.size(); i++) {\r
- search->addSequence(templateSequences[i]);\r
- }\r
- search->generateDB();\r
- search->setNumSeqs(numSeqs);\r
-\r
- return 0;\r
- }\r
- catch(exception& e) {\r
- m->errorOut(e, "AlignmentDB", "MPIRecv");\r
- exit(1);\r
- }\r
-}\r
-#endif\r
/**************************************************************************************************/\r
\r
\r