@ -1,6 +1,6 @@
# include "MatchBoxPC.h"
# include "MatchBoxPC.h"
# ifdef OPENMP
//#define DEBUG_HANG_
//#define DEBUG_HANG_
# if !defined(SERIAL_MPI)
void processMatchedVerticesAndSendMessages (
void processMatchedVerticesAndSendMessages (
MilanLongInt NLVer ,
MilanLongInt NLVer ,
vector < MilanLongInt > & UChunkBeingProcessed ,
vector < MilanLongInt > & UChunkBeingProcessed ,
@ -64,29 +64,29 @@ void processMatchedVerticesAndSendMessages(
{
{
while ( ! U . empty ( ) ) {
while ( ! U . empty ( ) ) {
extractUChunk ( UChunkBeingProcessed , U , privateU ) ;
extractUChunk ( UChunkBeingProcessed , U , privateU ) ;
for ( MilanLongInt u : UChunkBeingProcessed ) {
for ( MilanLongInt u : UChunkBeingProcessed ) {
# ifdef PRINT_DEBUG_INFO_
# ifdef PRINT_DEBUG_INFO_
cout < < " \n ( " < < myRank < < " )u: " < < u ;
cout < < " \n ( " < < myRank < < " )u: " < < u ;
fflush ( stdout ) ;
fflush ( stdout ) ;
# endif
# endif
if ( ( u > = StartIndex ) & & ( u < = EndIndex ) ) { // Process Only the Local Vertices
if ( ( u > = StartIndex ) & & ( u < = EndIndex ) ) { // Process Only the Local Vertices
# ifdef COUNT_LOCAL_VERTEX
# ifdef COUNT_LOCAL_VERTEX
localVertices + + ;
localVertices + + ;
# endif
# endif
// Get the Adjacency list for u
// Get the Adjacency list for u
adj1 = verLocPtr [ u - StartIndex ] ; // Pointer
adj1 = verLocPtr [ u - StartIndex ] ; // Pointer
adj2 = verLocPtr [ u - StartIndex + 1 ] ;
adj2 = verLocPtr [ u - StartIndex + 1 ] ;
for ( k = adj1 ; k < adj2 ; k + + ) {
for ( k = adj1 ; k < adj2 ; k + + ) {
option = - 1 ;
option = - 1 ;
v = verLocInd [ k ] ;
v = verLocInd [ k ] ;
if ( ( v > = StartIndex ) & & ( v < = EndIndex ) ) { // If Local Vertex:
if ( ( v > = StartIndex ) & & ( v < = EndIndex ) ) { // If Local Vertex:
# ifdef PRINT_DEBUG_INFO_
# ifdef PRINT_DEBUG_INFO_
cout < < " \n ( " < < myRank < < " )v: " < < v < < " c(v)= " < < candidateMate [ v - StartIndex ] < < " Mate[v]: " < < Mate [ v ] ;
cout < < " \n ( " < < myRank < < " )v: " < < v < < " c(v)= " < < candidateMate [ v - StartIndex ] < < " Mate[v]: " < < Mate [ v ] ;
fflush ( stdout ) ;
fflush ( stdout ) ;
@ -108,28 +108,28 @@ void processMatchedVerticesAndSendMessages(
GMate ,
GMate ,
Mate ,
Mate ,
Ghost2LocalMap ) ;
Ghost2LocalMap ) ;
candidateMate [ v - StartIndex ] = w ;
candidateMate [ v - StartIndex ] = w ;
# ifdef PRINT_DEBUG_INFO_
# ifdef PRINT_DEBUG_INFO_
cout < < " \n ( " < < myRank < < " ) " < < v < < " Points to: " < < w ;
cout < < " \n ( " < < myRank < < " ) " < < v < < " Points to: " < < w ;
fflush ( stdout ) ;
fflush ( stdout ) ;
# endif
# endif
// If found a dominating edge:
// If found a dominating edge:
if ( w > = 0 ) {
if ( w > = 0 ) {
if ( ( w < StartIndex ) | | ( w > EndIndex ) ) { // A ghost
if ( ( w < StartIndex ) | | ( w > EndIndex ) ) { // A ghost
# ifdef PRINT_DEBUG_INFO_
# ifdef PRINT_DEBUG_INFO_
cout < < " \n ( " < < myRank < < " )Sending a request message: " ;
cout < < " \n ( " < < myRank < < " )Sending a request message: " ;
cout < < " \n ( " < < myRank < < " )Ghost is " < < w < < " Owner is: " < < findOwnerOfGhost ( w , verDistance , myRank , numProcs ) ;
cout < < " \n ( " < < myRank < < " )Ghost is " < < w < < " Owner is: " < < findOwnerOfGhost ( w , verDistance , myRank , numProcs ) ;
# endif
# endif
option = 2 ;
option = 2 ;
if ( candidateMate [ NLVer + Ghost2LocalMap [ w ] ] = = v ) {
if ( candidateMate [ NLVer + Ghost2LocalMap [ w ] ] = = v ) {
option = 1 ;
option = 1 ;
Mate [ v - StartIndex ] = w ; // v is a local vertex
Mate [ v - StartIndex ] = w ; // v is a local vertex
GMate [ Ghost2LocalMap [ w ] ] = v ; // w is a ghost vertex
GMate [ Ghost2LocalMap [ w ] ] = v ; // w is a ghost vertex
} // End of if CandidateMate[w] = v
} // End of if CandidateMate[w] = v
} // End of if a Ghost Vertex
} // End of if a Ghost Vertex
else { // w is a local vertex
else { // w is a local vertex
@ -137,7 +137,7 @@ void processMatchedVerticesAndSendMessages(
option = 3 ;
option = 3 ;
Mate [ v - StartIndex ] = w ; // v is a local vertex
Mate [ v - StartIndex ] = w ; // v is a local vertex
Mate [ w - StartIndex ] = v ; // w is a local vertex
Mate [ w - StartIndex ] = v ; // w is a local vertex
# ifdef PRINT_DEBUG_INFO_
# ifdef PRINT_DEBUG_INFO_
cout < < " \n ( " < < myRank < < " )MATCH: ( " < < v < < " , " < < w < < " ) " ;
cout < < " \n ( " < < myRank < < " )MATCH: ( " < < v < < " , " < < w < < " ) " ;
fflush ( stdout ) ;
fflush ( stdout ) ;
@ -153,7 +153,7 @@ void processMatchedVerticesAndSendMessages(
} // mateval < 0
} // mateval < 0
} // End of if ( (v >= StartIndex) && (v <= EndIndex) ) //If Local Vertex:
} // End of if ( (v >= StartIndex) && (v <= EndIndex) ) //If Local Vertex:
else { // Neighbor is a ghost vertex
else { // Neighbor is a ghost vertex
# pragma omp critical
# pragma omp critical
{
{
if ( candidateMate [ NLVer + Ghost2LocalMap [ v ] ] = = u )
if ( candidateMate [ NLVer + Ghost2LocalMap [ v ] ] = = u )
@ -162,7 +162,7 @@ void processMatchedVerticesAndSendMessages(
option = 5 ; // u is local
option = 5 ; // u is local
} // End of critical
} // End of critical
} // End of Else //A Ghost Vertex
} // End of Else //A Ghost Vertex
switch ( option )
switch ( option )
{
{
case - 1 :
case - 1 :
@ -180,20 +180,20 @@ void processMatchedVerticesAndSendMessages(
// Decrement the counter:
// Decrement the counter:
PROCESS_CROSS_EDGE ( & Counter [ Ghost2LocalMap [ w ] ] , SPtr ) ;
PROCESS_CROSS_EDGE ( & Counter [ Ghost2LocalMap [ w ] ] , SPtr ) ;
case 2 :
case 2 :
// Found a dominating edge, it is a ghost
// Found a dominating edge, it is a ghost
ghostOwner = findOwnerOfGhost ( w , verDistance , myRank , numProcs ) ;
ghostOwner = findOwnerOfGhost ( w , verDistance , myRank , numProcs ) ;
// Build the Message Packet:
// Build the Message Packet:
// Message[0] = v; // LOCAL
// Message[0] = v; // LOCAL
// Message[1] = w; // GHOST
// Message[1] = w; // GHOST
// Message[2] = REQUEST; // TYPE
// Message[2] = REQUEST; // TYPE
// Send a Request (Asynchronous)
// Send a Request (Asynchronous)
// MPI_Bsend(&Message[0], 3, TypeMap<MilanLongInt>(), ghostOwner, ComputeTag, comm);
// MPI_Bsend(&Message[0], 3, TypeMap<MilanLongInt>(), ghostOwner, ComputeTag, comm);
( * msgActual ) + + ;
( * msgActual ) + + ;
( * msgInd ) + + ;
( * msgInd ) + + ;
privateQLocalVtx . push_back ( v ) ;
privateQLocalVtx . push_back ( v ) ;
privateQGhostVtx . push_back ( w ) ;
privateQGhostVtx . push_back ( w ) ;
privateQMsgType . push_back ( REQUEST ) ;
privateQMsgType . push_back ( REQUEST ) ;
@ -211,94 +211,94 @@ void processMatchedVerticesAndSendMessages(
for ( k1 = adj11 ; k1 < adj12 ; k1 + + ) {
for ( k1 = adj11 ; k1 < adj12 ; k1 + + ) {
w = verLocInd [ k1 ] ;
w = verLocInd [ k1 ] ;
if ( ( w < StartIndex ) | | ( w > EndIndex ) ) { // A ghost
if ( ( w < StartIndex ) | | ( w > EndIndex ) ) { // A ghost
# ifdef PRINT_DEBUG_INFO_
# ifdef PRINT_DEBUG_INFO_
cout < < " \n ( " < < myRank < < " )Sending a failure message: " ;
cout < < " \n ( " < < myRank < < " )Sending a failure message: " ;
cout < < " \n ( " < < myRank < < " )Ghost is " < < w < < " Owner is: " < < findOwnerOfGhost ( w , verDistance , myRank , numProcs ) ;
cout < < " \n ( " < < myRank < < " )Ghost is " < < w < < " Owner is: " < < findOwnerOfGhost ( w , verDistance , myRank , numProcs ) ;
fflush ( stdout ) ;
fflush ( stdout ) ;
# endif
# endif
ghostOwner = findOwnerOfGhost ( w , verDistance , myRank , numProcs ) ;
ghostOwner = findOwnerOfGhost ( w , verDistance , myRank , numProcs ) ;
// Build the Message Packet:
// Build the Message Packet:
// Message[0] = v; // LOCAL
// Message[0] = v; // LOCAL
// Message[1] = w; // GHOST
// Message[1] = w; // GHOST
// Message[2] = FAILURE; // TYPE
// Message[2] = FAILURE; // TYPE
// Send a Request (Asynchronous)
// Send a Request (Asynchronous)
// MPI_Bsend(&Message[0], 3, TypeMap<MilanLongInt>(), ghostOwner, ComputeTag, comm);
// MPI_Bsend(&Message[0], 3, TypeMap<MilanLongInt>(), ghostOwner, ComputeTag, comm);
( * msgActual ) + + ;
( * msgActual ) + + ;
( * msgInd ) + + ;
( * msgInd ) + + ;
privateQLocalVtx . push_back ( v ) ;
privateQLocalVtx . push_back ( v ) ;
privateQGhostVtx . push_back ( w ) ;
privateQGhostVtx . push_back ( w ) ;
privateQMsgType . push_back ( FAILURE ) ;
privateQMsgType . push_back ( FAILURE ) ;
privateQOwner . push_back ( ghostOwner ) ;
privateQOwner . push_back ( ghostOwner ) ;
} // End of if(GHOST)
} // End of if(GHOST)
} // End of for loop
} // End of for loop
break ;
break ;
case 5 :
case 5 :
default :
default :
# ifdef PRINT_DEBUG_INFO_
# ifdef PRINT_DEBUG_INFO_
cout < < " \n ( " < < myRank < < " )Sending a success message: " ;
cout < < " \n ( " < < myRank < < " )Sending a success message: " ;
cout < < " \n ( " < < myRank < < " )Ghost is " < < v < < " Owner is: " < < findOwnerOfGhost ( v , verDistance , myRank , numProcs ) < < " \n " ;
cout < < " \n ( " < < myRank < < " )Ghost is " < < v < < " Owner is: " < < findOwnerOfGhost ( v , verDistance , myRank , numProcs ) < < " \n " ;
fflush ( stdout ) ;
fflush ( stdout ) ;
# endif
# endif
ghostOwner = findOwnerOfGhost ( v , verDistance , myRank , numProcs ) ;
ghostOwner = findOwnerOfGhost ( v , verDistance , myRank , numProcs ) ;
// Build the Message Packet:
// Build the Message Packet:
// Message[0] = u; // LOCAL
// Message[0] = u; // LOCAL
// Message[1] = v; // GHOST
// Message[1] = v; // GHOST
// Message[2] = SUCCESS; // TYPE
// Message[2] = SUCCESS; // TYPE
// Send a Request (Asynchronous)
// Send a Request (Asynchronous)
// MPI_Bsend(&Message[0], 3, TypeMap<MilanLongInt>(), ghostOwner, ComputeTag, comm);
// MPI_Bsend(&Message[0], 3, TypeMap<MilanLongInt>(), ghostOwner, ComputeTag, comm);
( * msgActual ) + + ;
( * msgActual ) + + ;
( * msgInd ) + + ;
( * msgInd ) + + ;
privateQLocalVtx . push_back ( u ) ;
privateQLocalVtx . push_back ( u ) ;
privateQGhostVtx . push_back ( v ) ;
privateQGhostVtx . push_back ( v ) ;
privateQMsgType . push_back ( SUCCESS ) ;
privateQMsgType . push_back ( SUCCESS ) ;
privateQOwner . push_back ( ghostOwner ) ;
privateQOwner . push_back ( ghostOwner ) ;
break ;
break ;
} // End of switch
} // End of switch
} // End of inner for
} // End of inner for
}
}
} // End of outer for
} // End of outer for
queuesTransfer ( U , privateU , QLocalVtx ,
queuesTransfer ( U , privateU , QLocalVtx ,
QGhostVtx ,
QGhostVtx ,
QMsgType , QOwner , privateQLocalVtx ,
QMsgType , QOwner , privateQLocalVtx ,
privateQGhostVtx ,
privateQGhostVtx ,
privateQMsgType ,
privateQMsgType ,
privateQOwner ) ;
privateQOwner ) ;
} // End of while ( !U.empty() )
} // End of while ( !U.empty() )
# ifdef COUNT_LOCAL_VERTEX
# ifdef COUNT_LOCAL_VERTEX
printf ( " Count local vertexes: %ld for thread %d of processor %d \n " ,
printf ( " Count local vertexes: %ld for thread %d of processor %d \n " ,
localVertices ,
localVertices ,
omp_get_thread_num ( ) ,
omp_get_thread_num ( ) ,
myRank ) ;
myRank ) ;
# endif
# endif
} // End of parallel region
} // End of parallel region
// Send the messages
// Send the messages
# ifdef DEBUG_HANG_
# ifdef DEBUG_HANG_
cout < < myRank < < " Sending: " < < QOwner . size ( ) - initialSize < < " messages " < < endl ;
cout < < myRank < < " Sending: " < < QOwner . size ( ) - initialSize < < " messages " < < endl ;
# endif
# endif
for ( int i = initialSize ; i < QOwner . size ( ) ; i + + ) {
for ( int i = initialSize ; i < QOwner . size ( ) ; i + + ) {
Message [ 0 ] = QLocalVtx [ i ] ;
Message [ 0 ] = QLocalVtx [ i ] ;
Message [ 1 ] = QGhostVtx [ i ] ;
Message [ 1 ] = QGhostVtx [ i ] ;
Message [ 2 ] = QMsgType [ i ] ;
Message [ 2 ] = QMsgType [ i ] ;
ghostOwner = QOwner [ i ] ;
ghostOwner = QOwner [ i ] ;
//MPI_Bsend(&Message[0], 3, TypeMap<MilanLongInt>(), ghostOwner, ComputeTag, comm);
//MPI_Bsend(&Message[0], 3, TypeMap<MilanLongInt>(), ghostOwner, ComputeTag, comm);
//cout << myRank<<" Sending to "<<ghostOwner<<endl;
//cout << myRank<<" Sending to "<<ghostOwner<<endl;
MPI_Bsend ( & Message [ 0 ] , 3 , TypeMap < MilanLongInt > ( ) , ghostOwner , ComputeTag , comm ) ;
MPI_Bsend ( & Message [ 0 ] , 3 , TypeMap < MilanLongInt > ( ) , ghostOwner , ComputeTag , comm ) ;