Esempio n. 1
0
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();
		}
	}
}
Esempio n. 2
0
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;
		}
	}
}
Esempio n. 3
0
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);
		}
	}
}
Esempio n. 4
0
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;
		}
	}
}
Esempio n. 5
0
void ValueAnnotation:: register_annot()
{
   ReadAnnotation* op = ReadAnnotation::get_inst();
   op->add_TypeCollection( &values);
   op->add_OperatorCollection(&valueRestrict);
}
Esempio n. 6
0
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);
        }
    }
}