|
|
@ -77,7 +77,6 @@ void processMatchedVerticesAndSendMessages(
|
|
|
|
#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];
|
|
|
@ -97,58 +96,57 @@ void processMatchedVerticesAndSendMessages(
|
|
|
|
if (mateVal < 0) {
|
|
|
|
if (mateVal < 0) {
|
|
|
|
#pragma omp critical
|
|
|
|
#pragma omp critical
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (candidateMate[v - StartIndex] == u) {
|
|
|
|
#pragma omp atomic read
|
|
|
|
// Start: PARALLEL_PROCESS_EXPOSED_VERTEX_B(v)
|
|
|
|
mateVal = Mate[v - StartIndex];
|
|
|
|
w = computeCandidateMate(verLocPtr[v - StartIndex],
|
|
|
|
// If the current vertex is pointing to a matched vertex and is not matched
|
|
|
|
verLocPtr[v - StartIndex + 1],
|
|
|
|
if (mateVal < 0) {
|
|
|
|
edgeLocWeight, 0,
|
|
|
|
|
|
|
|
verLocInd,
|
|
|
|
if (candidateMate[v - StartIndex] == u) {
|
|
|
|
StartIndex,
|
|
|
|
// Start: PARALLEL_PROCESS_EXPOSED_VERTEX_B(v)
|
|
|
|
EndIndex,
|
|
|
|
w = computeCandidateMate(verLocPtr[v - StartIndex],
|
|
|
|
GMate,
|
|
|
|
verLocPtr[v - StartIndex + 1],
|
|
|
|
Mate,
|
|
|
|
edgeLocWeight, 0,
|
|
|
|
Ghost2LocalMap);
|
|
|
|
verLocInd, StartIndex, EndIndex,
|
|
|
|
|
|
|
|
GMate, Mate, 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
|
|
|
|
if (candidateMate[w - StartIndex] == v) {
|
|
|
|
if (candidateMate[w - StartIndex] == v) {
|
|
|
|
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);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
} // End of if(CandidateMate(w) = v
|
|
|
|
} // End of if(CandidateMate(w) = v
|
|
|
|
} // End of Else
|
|
|
|
} // End of Else
|
|
|
|
} // End of if(w >=0)
|
|
|
|
} // End of if(w >=0)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
option = 4; // End of Else: w == -1
|
|
|
|
option = 4; // End of Else: w == -1
|
|
|
|
// End: PARALLEL_PROCESS_EXPOSED_VERTEX_B(v)
|
|
|
|
// End: PARALLEL_PROCESS_EXPOSED_VERTEX_B(v)
|
|
|
|
} // End of If (candidateMate[v-StartIndex] == u
|
|
|
|
} // End of If (candidateMate[v-StartIndex] == u
|
|
|
|
|
|
|
|
}
|
|
|
|
} // End of task
|
|
|
|
} // End of task
|
|
|
|
} // mateval < 0
|
|
|
|
} // mateval < 0
|
|
|
|
} // End of if ( (v >= StartIndex) && (v <= EndIndex) ) //If Local Vertex:
|
|
|
|
} // End of if ( (v >= StartIndex) && (v <= EndIndex) ) //If Local Vertex:
|
|
|
@ -211,15 +209,12 @@ 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
|
|
|
@ -229,7 +224,6 @@ void processMatchedVerticesAndSendMessages(
|
|
|
|
|
|
|
|
|
|
|
|
(*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);
|
|
|
@ -248,17 +242,14 @@ void processMatchedVerticesAndSendMessages(
|
|
|
|
#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);
|
|
|
@ -281,10 +272,7 @@ void processMatchedVerticesAndSendMessages(
|
|
|
|
|
|
|
|
|
|
|
|
#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, mp_get_thread_num(), myRank);
|
|
|
|
omp_get_thread_num(),
|
|
|
|
|
|
|
|
myRank);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
} // End of parallel region
|
|
|
|
} // End of parallel region
|
|
|
|
|
|
|
|
|
|
|
@ -293,12 +281,10 @@ void processMatchedVerticesAndSendMessages(
|
|
|
|
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);
|
|
|
|