void VertexMessenger::work(){ if(m_isDone){ return; }else if(!m_requestedBasicInfo){ m_requestedBasicInfo=true; m_receivedBasicInfo=false; uint64_t*message=(uint64_t*)m_outboxAllocator->allocate(3*sizeof(uint64_t)); int j=0; m_vertex.pack(message,&j); message[j++]=m_waveId; message[j++]=m_wavePosition; Message aMessage(message,j,m_destination,RAY_MPI_TAG_VERTEX_INFO,m_parameters->getRank()); m_outbox->push_back(aMessage); }else if(!m_receivedBasicInfo &&m_inbox->size()==1&&m_inbox->at(0)->getTag()==RAY_MPI_TAG_VERTEX_INFO_REPLY){ m_receivedBasicInfo=true; uint64_t*buffer=(uint64_t*)m_inbox->at(0)->getBuffer(); m_coverageValue=buffer[0]; m_edges=buffer[1]; m_numberOfAnnotations=buffer[2]; m_pointer=(void*)buffer[3]; int numberOfReadsInMessage=buffer[4]; int i=0; while(i<numberOfReadsInMessage){ int theRank=buffer[5+4*i]; int index=buffer[5+4*i+1]; int strandPosition=buffer[5+4*i+2]; char strand=buffer[5+4*i+3]; #ifdef ASSERT assert(theRank>=0); if(theRank>=m_parameters->getSize()){ cout<<"Rank="<<theRank<<" Size="<<m_parameters->getSize()<<endl; } assert(theRank<m_parameters->getSize()); assert(strand=='F'||strand=='R'); #endif ReadAnnotation e; e.constructor(theRank,index,strandPosition,strand,false); m_annotations.push_back(e); i++; } if(m_pointer==NULL){ m_isDone=true; }else{ m_requestedReads=false; m_mateIterator=m_matesToMeet->begin(); } }else if(m_receivedBasicInfo){ if(m_coverageValue>=3*m_parameters->getPeakCoverage()){ getReadsForRepeatedVertex(); }else{ getReadsForUniqueVertex(); } } }
void VertexMessenger::getReadsForRepeatedVertex(){ if(!m_requestedReads){ uint64_t*message=(uint64_t*)m_outboxAllocator->allocate(MAXIMUM_MESSAGE_SIZE_IN_BYTES); int j=0; m_vertex.pack(message,&j); message[j++]=(uint64_t)m_pointer; int maximumMates=MAXIMUM_MESSAGE_SIZE_IN_BYTES/sizeof(uint64_t)/4; int processed=0; while(processed<maximumMates&&m_mateIterator!=m_matesToMeet->end()){ uint64_t mate=*m_mateIterator; message[j+1+processed]=mate; processed++; m_mateIterator++; } message[j]=processed; /* * <--vertex--><--pointer--><--numberOfMates--><--mates --> */ Message aMessage(message,j+1+processed, m_destination,RAY_MPI_TAG_VERTEX_READS_FROM_LIST,m_parameters->getRank()); m_outbox->push_back(aMessage); m_requestedReads=true; m_receivedReads=false; }else if(!m_receivedReads&&m_inbox->size()==1&&m_inbox->at(0)->getTag()==RAY_MPI_TAG_VERTEX_READS_FROM_LIST_REPLY){ m_receivedReads=true; uint64_t*buffer=(uint64_t*)m_inbox->at(0)->getBuffer(); int numberOfReadsInMessage=buffer[0]; int i=0; while(i<numberOfReadsInMessage){ int theRank=buffer[1+4*i]; int index=buffer[1+4*i+1]; int strandPosition=buffer[1+4*i+2]; char strand=buffer[1+4*i+3]; #ifdef ASSERT assert(theRank>=0); if(theRank>=m_parameters->getSize()){ cout<<"Rank="<<theRank<<" Size="<<m_parameters->getSize()<<endl; } assert(theRank<m_parameters->getSize()); assert(strand=='F'||strand=='R'); #endif ReadAnnotation e; e.constructor(theRank,index,strandPosition,strand,false); m_annotations.push_back(e); i++; } if(m_mateIterator==m_matesToMeet->end()){ m_isDone=true; }else{ m_requestedReads=false; } } }
void ReadFetcher::work(){ if(m_done){ return; } if(!m_readsRequested){ uint64_t*message2=(uint64_t*)m_outboxAllocator->allocate(MAXIMUM_MESSAGE_SIZE_IN_BYTES); int bufferPosition=0; m_vertex.pack(message2,&bufferPosition); message2[bufferPosition++]=(uint64_t)m_pointer; int destination=m_parameters->_vertexRank(&m_vertex); Message aMessage(message2,bufferPosition,destination,RAY_MPI_TAG_REQUEST_VERTEX_READS,m_parameters->getRank()); m_virtualCommunicator->pushMessage(m_workerId,&aMessage); m_readsRequested=true; }else if(m_virtualCommunicator->isMessageProcessed(m_workerId)){ vector<uint64_t> buffer; m_virtualCommunicator->getMessageResponseElements(m_workerId,&buffer); #ifdef ASSERT assert((int)buffer.size()==5); #endif m_pointer=(void*)buffer[0]; int rank=buffer[1]; if(rank!=INVALID_RANK){ #ifdef ASSERT if(!(rank>=0&&rank<m_parameters->getSize())){ cout<<"Error rank="<<rank<<endl; cout<<"Buffer: "; for(int i=0;i<5;i++){ cout<<buffer[i]<<" "; } cout<<endl; } assert(rank>=0&&rank<m_parameters->getSize()); #endif ReadAnnotation readAnnotation; readAnnotation.constructor(rank,buffer[2],buffer[3],buffer[4],false); m_reads.push_back(readAnnotation); } if(m_pointer==NULL){ m_done=true; }else{ uint64_t*message2=(uint64_t*)m_outboxAllocator->allocate(MAXIMUM_MESSAGE_SIZE_IN_BYTES); int bufferPosition=0; m_vertex.pack(message2,&bufferPosition); message2[bufferPosition++]=(uint64_t)m_pointer; int destination=m_parameters->_vertexRank(&m_vertex); Message aMessage(message2,bufferPosition,destination,RAY_MPI_TAG_REQUEST_VERTEX_READS,m_parameters->getRank()); m_virtualCommunicator->pushMessage(m_workerId,&aMessage); } } }
void VertexMessenger::getReadsForUniqueVertex(){ if(!m_requestedReads){ uint64_t*message=(uint64_t*)m_outboxAllocator->allocate(2*sizeof(uint64_t)); int j=0; m_vertex.pack(message,&j); message[j++]=(uint64_t)m_pointer; Message aMessage(message,j,m_destination,RAY_MPI_TAG_VERTEX_READS,m_parameters->getRank()); m_outbox->push_back(aMessage); m_requestedReads=true; m_receivedReads=false; }else if(!m_receivedReads&&m_inbox->size()==1&&m_inbox->at(0)->getTag()==RAY_MPI_TAG_VERTEX_READS_REPLY){ m_receivedReads=true; uint64_t*buffer=(uint64_t*)m_inbox->at(0)->getBuffer(); int numberOfReadsInMessage=buffer[0]; int i=0; while(i<numberOfReadsInMessage){ int theRank=buffer[1+4*i]; int index=buffer[1+4*i+1]; int strandPosition=buffer[1+4*i+2]; char strand=buffer[1+4*i+3]; #ifdef ASSERT assert(theRank>=0); if(theRank>=m_parameters->getSize()){ cout<<"Rank="<<theRank<<" Size="<<m_parameters->getSize()<<endl; } assert(theRank<m_parameters->getSize()); assert(strand=='F'||strand=='R'); #endif ReadAnnotation e; e.constructor(theRank,index,strandPosition,strand,false); m_annotations.push_back(e); i++; } m_pointer=(void*)buffer[1+numberOfReadsInMessage*4]; if((int)m_annotations.size()==m_numberOfAnnotations){ m_isDone=true; }else{ m_requestedReads=false; } } }
void ReadFetcher::work() { if(m_done) { return; } if(!m_readsRequested) { MessageUnit*message2=(MessageUnit*)m_outboxAllocator->allocate(MAXIMUM_MESSAGE_SIZE_IN_BYTES); #ifdef CONFIG_ASSERT assert(message2 != NULL); #endif int bufferPosition=0; m_vertex.pack(message2,&bufferPosition); MessageUnit integerValue=pack_pointer((void**)&m_pointer); // fancy trick to transmit a void* over the network message2[bufferPosition++]=integerValue; int period=m_virtualCommunicator->getElementsPerQuery(RAY_MPI_TAG_REQUEST_VERTEX_READS); // do some padding while(bufferPosition<period) { #ifdef CONFIG_ASSERT assert(bufferPosition * sizeof(MessageUnit) < MAXIMUM_MESSAGE_SIZE_IN_BYTES); #endif message2[bufferPosition++]=0; } #ifdef CONFIG_ASSERT int start=KMER_U64_ARRAY_SIZE+1; assert(period>=5); // Padding must be 0. while(start<period) { if(message2[start]!=0) { cout<<"Error, padding must be 0."<<endl; } assert(message2[start]==0); start++; } #endif int destination=m_parameters->vertexRank(&m_vertex); #ifdef GUILLIMIN_BUG if(m_parameters->getRank()==destination) { cout<<endl; cout<<"worker: "<<m_workerId<<endl; cout<<"Sending9 RAY_MPI_TAG_REQUEST_VERTEX_READS ptr="<<m_pointer<<" "; cout<<" integerValue= "<<integerValue<<" to "<<destination<<endl; for(int i=0; i<period; i++) cout<<" "<<i<<" -> "<<message2[i]; cout<<endl; } #endif Message aMessage(message2,period,destination,RAY_MPI_TAG_REQUEST_VERTEX_READS, m_parameters->getRank()); m_virtualCommunicator->pushMessage(m_workerId,&aMessage); m_readsRequested=true; } else if(m_virtualCommunicator->isMessageProcessed(m_workerId)) { vector<MessageUnit> buffer; m_virtualCommunicator->getMessageResponseElements(m_workerId,&buffer); #ifdef CONFIG_ASSERT int period=m_virtualCommunicator->getElementsPerQuery(RAY_MPI_TAG_REQUEST_VERTEX_READS); assert((int)buffer.size()==period); #endif //. ------ #ifdef GUILLIMIN_BUG int destination=m_parameters->vertexRank(&m_vertex); if(m_parameters->getRank()==destination) { cout<<endl; cout<<"worker: "<<m_workerId<<endl; cout<<"Receiving RAY_MPI_TAG_REQUEST_VERTEX_READS_REPLY ptr="<<m_pointer<<" from "<<endl; for(int i=0; i<period; i++) cout<<" "<<i<<" -> "<<buffer[i]; cout<<endl; } #endif // fancy trick to transmit a void* over the network unpack_pointer((void**)&m_pointer,buffer[0]); int rank=buffer[1]; if(rank!=INVALID_RANK) { #ifdef CONFIG_ASSERT if(!(rank>=0&&rank<m_parameters->getSize())) { cout<<"Error rank="<<rank<<endl; cout<<"Buffer: "; for(int i=0; i<period; i++) { cout<<buffer[i]<<" "; } cout<<endl; } assert(rank>=0&&rank<m_parameters->getSize()); #endif int readIndex=buffer[2]; int position=buffer[3]; char strand=(char)buffer[4]; #ifdef CONFIG_ASSERT int destination=m_parameters->vertexRank(&m_vertex); assert(readIndex>=0); assert(position>=0); if(!(strand=='F'||strand=='R')) { cout<<"Error, invalid strand from "<<destination<<" strand= "<<strand<<" or "; cout<<buffer[4]<<endl; } assert(strand=='F'||strand=='R'); #endif ReadAnnotation readAnnotation; readAnnotation.constructor(rank,readIndex,position,strand,false); m_reads.push_back(readAnnotation); } if(m_pointer==NULL) { m_done=true; } else { MessageUnit*message2=(MessageUnit*)m_outboxAllocator->allocate(MAXIMUM_MESSAGE_SIZE_IN_BYTES); int bufferPosition=0; m_vertex.pack(message2,&bufferPosition); MessageUnit integerValue=pack_pointer((void**)&m_pointer); message2[bufferPosition++]=integerValue; int period=m_virtualCommunicator->getElementsPerQuery(RAY_MPI_TAG_REQUEST_VERTEX_READS); // do some padding while(bufferPosition<period) { message2[bufferPosition++]=0; } int destination=m_parameters->vertexRank(&m_vertex); Message aMessage(message2,period,destination,RAY_MPI_TAG_REQUEST_VERTEX_READS,m_parameters->getRank()); #ifdef GUILLIMIN_BUG if(m_parameters->getRank()==destination) { cout<<endl; cout<<"worker: "<<m_workerId<<endl; cout<<"Sending11 RAY_MPI_TAG_REQUEST_VERTEX_READS ptr="<<m_pointer<<" "; cout<<" integerValue= "<<integerValue<<" to "<<destination<<endl; for(int i=0; i<period; i++) cout<<" "<<i<<" -> "<<message2[i]; cout<<endl; } #endif m_virtualCommunicator->pushMessage(m_workerId,&aMessage); } } }