void SSearchTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char *params ) { if (exec) logln("TestSuite SSearchTest: "); switch (index) { #if !UCONFIG_NO_BREAK_ITERATION case 0: name = "searchTest"; if (exec) searchTest(); break; case 1: name = "offsetTest"; if (exec) offsetTest(); break; case 2: name = "monkeyTest"; if (exec) monkeyTest(params); break; case 3: name = "sharpSTest"; if (exec) sharpSTest(); break; case 4: name = "goodSuffixTest"; if (exec) goodSuffixTest(); break; case 5: name = "searchTime"; if (exec) searchTime(); break; #endif default: name = ""; break; //needed to end loop } }
int TransmitProteinsToChildProcesses() { int numProteins = (int) proteins.size(); vector< simplethread_handle_t > workerHandles; int sourceProcess, batchSize; bool IsFinished = false; Timer searchTime( true ); float totalSearchTime = 0.01f; float lastUpdate = 0.0f; int i = 0; int numChildrenFinished = 0; while( numChildrenFinished < g_numChildren ) { #ifdef MPI_DEBUG cout << g_hostString << " is listening for a child process to offer to search some proteins." << endl; #endif // Listen for a process requesting proteins. // Extract the number of CPUs available on the process. MPI_Recv( &sourceProcess, 1, MPI_INT, MPI_ANY_SOURCE, 0xFF, MPI_COMM_WORLD, &st ); int sourceCPUs = 0; MPI_Recv( &sourceCPUs, 1, MPI_INT, sourceProcess, 0xFF, MPI_COMM_WORLD, &st ); int pOffset = i; // Scale the batchSize with the number of cpus in the requested process. batchSize = min( numProteins-i, g_rtConfig->ProteinBatchSize*sourceCPUs ); stringstream packStream; binary_oarchive packArchive( packStream ); try { packArchive & pOffset; string proteinStream; for( int j = i; j < i + batchSize; ++j ) { proteinStream += ">" + proteins[j].getName() + " " + proteins[j].getDescription() + "\n" + proteins[j].getSequence() + "\n"; } packArchive & proteinStream; } catch( exception& e ) { cerr << g_hostString << " had an error: " << e.what() << endl; exit(1); } #ifdef MPI_DEBUG cout << "Process #" << sourceProcess << " has " << sourceCPUs << " cpus. Sending " << batchSize << " proteins." << endl; #endif if( i < numProteins ) { MPI_Ssend( &batchSize, 1, MPI_INT, sourceProcess, 0x99, MPI_COMM_WORLD ); #ifdef MPI_DEBUG cout << g_hostString << " is sending " << batchSize << " proteins." << endl; Timer sendTime(true); #endif string pack = packStream.str(); int len = (int) pack.length(); MPI_Send( &len, 1, MPI_INT, sourceProcess, 0x00, MPI_COMM_WORLD ); MPI_Send( (void*) pack.c_str(), len, MPI_CHAR, sourceProcess, 0x01, MPI_COMM_WORLD ); #ifdef MPI_DEBUG cout << g_hostString << " finished sending " << batchSize << " proteins; " << sendTime.End() << " seconds elapsed." << endl; #endif i += batchSize; } else { batchSize = 0; MPI_Ssend( &batchSize, 1, MPI_INT, sourceProcess, 0x99, MPI_COMM_WORLD ); #ifdef MPI_DEBUG cout << "Process #" << sourceProcess << " has been informed that all proteins have been searched." << endl; #endif ++numChildrenFinished; } totalSearchTime = searchTime.TimeElapsed(); if( !IsFinished && ( ( totalSearchTime - lastUpdate > g_rtConfig->StatusUpdateFrequency ) || i+1 == numProteins ) ) { if( i+1 == numProteins ) IsFinished = true; float proteinsPerSec = float(i+1) / totalSearchTime; bpt::time_duration estimatedTimeRemaining(0, 0, round((numProteins - i) / proteinsPerSec)); cout << "Searched " << i << " of " << numProteins << " proteins; " << round(proteinsPerSec) << " per second, " << format_date_time("%H:%M:%S", bpt::time_duration(0, 0, round(totalSearchTime))) << " elapsed, " << format_date_time("%H:%M:%S", estimatedTimeRemaining) << " remaining." << endl; lastUpdate = totalSearchTime; } } return 0; }