Reformat initialize, refactoring of initialize completed

omp-walther
StefanoPetrilli 3 years ago
parent 7741abd45d
commit ea040ae5ee

@ -214,6 +214,7 @@ void dalgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateCMP(
bool isEmpty;
//Declare the locks
// TODO destroy the locks
omp_lock_t MateLock[NLVer];
initialize(NLVer, NLEdge, StartIndex,

@ -8,7 +8,7 @@
#include "dataStrStaticQueue.h"
#include "omp.h"
#define NUM_THREAD 4
#define NUM_THREAD 12
inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
MilanLongInt StartIndex, MilanLongInt EndIndex,
@ -35,8 +35,7 @@ inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
staticQueue &privateQLocalVtx,
staticQueue &privateQGhostVtx,
staticQueue &privateQMsgType,
staticQueue& privateQOwner
)
staticQueue &privateQOwner)
{
MilanLongInt insertMe = 0, numGhostEdges = 0, numGhostVertices = 0;
@ -53,8 +52,6 @@ inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
{
// Initialize the locks
//TODO this can be executed as task in parallel with other unparallelizable tasks
//TODO destroy the locks
#pragma omp taskloop num_tasks(NUM_THREAD)
for (i = 0; i < NLVer; i++)
omp_init_lock(&MateLock[i]);
@ -65,29 +62,33 @@ inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
/*
* OMP Ghost2LocalInitialization
* The cycle analyzes all the edges and when finds a ghost edge
* This loop analyzes all the edges and when finds a ghost edge
* puts it in the Ghost2LocalMap.
* A critical region is needed when inserting data in the map.
*
* Despite the critical region it is still productive to
* parallelize this for because the critical region is exeuted
* parallelize this cycle because the critical region is exeuted
* only when a ghost edge is found and ghost edges are a minority,
* circa 3.5% during the tests.
*/
#pragma omp taskloop num_tasks(NUM_THREAD) reduction(+ : numGhostEdges) depend ( out : numGhostEdges, Counter, Ghost2LocalMap )
for (i = 0; i < NLEdge; i++) { //O(m) - Each edge stored twice
#pragma omp taskloop num_tasks(NUM_THREAD) reduction(+ \
: numGhostEdges) depend(out \
: numGhostEdges, Counter, Ghost2LocalMap)
for (i = 0; i < NLEdge; i++)
{ // O(m) - Each edge stored twice
insertMe = verLocInd[i];
//cout<<"InsertMe on Process "<<myRank<<" is: "<<insertMe<<endl;
if ((insertMe < StartIndex) || (insertMe > EndIndex)) { //Find a ghost
if ((insertMe < StartIndex) || (insertMe > EndIndex))
{ // Find a ghost
numGhostEdges++;
#pragma omp critical
{
storedAlready = Ghost2LocalMap.find(insertMe);
if (storedAlready != Ghost2LocalMap.end()) { //Has already been added
//cout<<"Process "<<myRank<<" found: "<<storedAlready->first<<" - "<<storedAlready->second<<endl;
if (storedAlready != Ghost2LocalMap.end())
{ // Has already been added
Counter[storedAlready->second]++; // Increment the counter
} else { //Insert an entry for the ghost:
//cout<<"Process "<<myRank<<" * New insert: Key="<<insertMe<< " : Value="<<numGhostVertices<<endl;
}
else
{ // Insert an entry for the ghost:
Ghost2LocalMap[insertMe] = numGhostVertices; // Add a map entry
Counter.push_back(1); // Initialize the counter
numGhostVertices++; // Increment the number of ghost vertices
@ -103,11 +104,14 @@ inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
#ifdef PRINT_DEBUG_INFO_
cout << "\n(" << myRank << ")NGhosts:" << numGhostVertices << " GhostEdges: " << numGhostEdges;
if (!Ghost2LocalMap.empty()) {
if (!Ghost2LocalMap.empty())
{
cout << "\n(" << myRank << ")Final Map : on process ";
cout<<"\n("<<myRank<<")Key \t Value \t Counter \n"; fflush(stdout);
cout << "\n(" << myRank << ")Key \t Value \t Counter \n";
fflush(stdout);
storedAlready = Ghost2LocalMap.begin();
do {
do
{
cout << storedAlready->second << " - " << storedAlready->first << " : " << Counter[storedAlready->second] << endl;
fflush(stdout);
storedAlready++;
@ -115,16 +119,21 @@ inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
}
#endif
#pragma omp task depend ( out : verGhostPtr, tempCounter, verGhostInd, GMate) depend ( in : numGhostVertices)
#pragma omp task depend(out \
: verGhostPtr, tempCounter, verGhostInd, GMate) depend(in \
: numGhostVertices)
{
// Initialize adjacency Lists for Ghost Vertices:
try {
try
{
verGhostPtr.reserve(numGhostVertices + 1); // Pointer Vector
tempCounter.reserve(numGhostVertices); // Pointer Vector
verGhostInd.reserve(numGhostEdges); // Index Vector
GMate.reserve(numGhostVertices); // Ghost Mate Vector
} catch (length_error) {
}
catch (length_error)
{
cout << "Error in function algoDistEdgeApproxDominatingEdgesLinearSearch: \n";
cout << "Not enough memory to allocate the internal variables \n";
exit(1);
@ -136,28 +145,34 @@ inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
GMate.resize(numGhostVertices, -1); // Temporary Counter
verGhostPtr[0] = 0; // The first value
#ifdef PRINT_DEBUG_INFO_
cout<<"\n("<<myRank<<")Ghost Vertex Pointer: "; fflush(stdout);
#endif
#ifdef TIME_TRACKER
double verGhostPtrInitialization = MPI_Wtime();
cout << "\n(" << myRank << ")Ghost Vertex Pointer: ";
fflush(stdout);
#endif
} // End of task
#pragma omp task depent ( out : verGhostPtr ) depend ( in : Counter, numGhostVertices)
#pragma omp task depent(out \
: verGhostPtr) depend(in \
: Counter, numGhostVertices)
{
for (i = 0; i < numGhostVertices; i++) { //O(|Ghost Vertices|)
#ifdef TIME_TRACKER
double verGhostPtrInitialization = MPI_Wtime();
#endif
for (i = 0; i < numGhostVertices; i++)
{ // O(|Ghost Vertices|)
verGhostPtr[i + 1] = verGhostPtr[i] + Counter[i];
#ifdef PRINT_DEBUG_INFO_
cout<<verGhostPtr[i]<<"\t"; fflush(stdout);
cout << verGhostPtr[i] << "\t";
fflush(stdout);
#endif
}
}//End of task
#ifdef TIME_TRACKER
verGhostPtrInitialization = MPI_Wtime() - verGhostPtrInitialization;
fprintf(stderr, "verGhostPtrInitialization time: %f\n", verGhostPtrInitialization);
#endif
} // End of task
#ifdef PRINT_DEBUG_INFO_
if (numGhostVertices > 0)
@ -183,13 +198,18 @@ inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
* are a minority hence the critical region is executed
* few times, circa 3.5% of the times in the tests.
*/
#pragma omp taskloop num_tasks(NUM_THREAD) depend ( in : insertMe, Ghost2LocalMap, tempCounter) depend ( out : verGhostInd)
for (v = 0; v < NLVer; v++) {
#pragma omp taskloop num_tasks(NUM_THREAD) depend(in \
: insertMe, Ghost2LocalMap, tempCounter) depend(out \
: verGhostInd)
for (v = 0; v < NLVer; v++)
{
adj1 = verLocPtr[v]; // Vertex Pointer
adj2 = verLocPtr[v + 1];
for (k = adj1; k < adj2; k++) {
for (k = adj1; k < adj2; k++)
{
w = verLocInd[k]; // Get the adjacent vertex
if ((w < StartIndex) || (w > EndIndex)) { //Find a ghost
if ((w < StartIndex) || (w > EndIndex))
{ // Find a ghost
#pragma omp critical
{
insertMe = verGhostPtr[Ghost2LocalMap[w]] + tempCounter[Ghost2LocalMap[w]]; // Where to insert
@ -211,30 +231,58 @@ inline void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
cout << "\n(" << myRank << ")Ghost Vertex Index: ";
for (v = 0; v < numGhostEdges; v++)
cout << verGhostInd[v] << "\t";
cout<<endl; fflush(stdout);
cout << endl;
fflush(stdout);
#endif
#pragma omp task depend ( in : numGhostEdges) depend ( out : QLocalVtx, QGhostVtx, QMsgType, QOwner )
#pragma omp task depend(in \
: numGhostEdges) depend(out \
: QLocalVtx, QGhostVtx, QMsgType, QOwner)
{
try
{
try {
QLocalVtx.reserve(numGhostEdges); // Local Vertex
QGhostVtx.reserve(numGhostEdges); // Ghost Vertex
QMsgType.reserve(numGhostEdges); // Message Type (Request/Failure)
QOwner.reserve(numGhostEdges); // Owner of the ghost: COmpute once and use later
} catch (length_error) {
}
catch (length_error)
{
cout << "Error in function algoDistEdgeApproxDominatingEdgesMessageBundling: \n";
cout << "Not enough memory to allocate the internal variables \n";
exit(1);
}
}
#pragma omp task depend( in : numGhostEdges, numGhostVertices ) depend ( out : candidateMate, S, U, privateU, privateQLocalVtx, privateQGhostVtx, privateQMsgType, privateQOwner)
{
#ifdef PRINT_DEBUG_INFO_
cout << "\n(" << myRank << ")Allocating CandidateMate.. ";
fflush(stdout);
#endif
#ifdef PRINT_DEBUG_INFO_
cout << "\n(" << myRank << "=========================************===============================" << endl;
fflush(stdout);
fflush(stdout);
#endif
#ifdef PRINT_DEBUG_INFO_
cout<<"\n("<<myRank<<")Allocating CandidateMate.. "; fflush(stdout);
cout << "\n(" << myRank << ") Setup Time :" << *ph0_time << endl;
fflush(stdout);
fflush(stdout);
#endif
#ifdef DEBUG_HANG_
if (myRank == 0)
cout << "\n(" << myRank << ") Setup Time :" << *ph0_time << endl;
fflush(stdout);
#endif
#pragma omp task depend(in \
: numGhostEdges, numGhostVertices) depend(out \
: candidateMate, S, U, privateU, privateQLocalVtx, privateQGhostVtx, privateQMsgType, privateQOwner)
{
//The values calculated in this function are sent back to the calling function
*numGhostEdgesPtr = numGhostEdges;
*numGhostVerticesPtr = numGhostVertices;
@ -246,20 +294,6 @@ cout<<"\n("<<myRank<<")Allocating CandidateMate.. "; fflush(stdout);
*/
candidateMate = new MilanLongInt[NLVer + numGhostVertices];
#ifdef PRINT_DEBUG_INFO_
cout<<"\n("<<myRank<<"=========================************==============================="<<endl; fflush(stdout);
fflush(stdout);
#endif
#ifdef PRINT_DEBUG_INFO_
cout<<"\n("<<myRank<<") Setup Time :"<< *ph0_time <<endl; fflush(stdout);
fflush(stdout);
#endif
#ifdef DEBUG_HANG_
if (myRank == 0) cout<<"\n("<<myRank<<") Setup Time :"<< *ph0_time <<endl; fflush(stdout);
#endif
*S = numGhostVertices; // Initialize S with number of Ghost Vertices
/*
@ -275,6 +309,7 @@ cout<<"\n("<<myRank<<")Allocating CandidateMate.. "; fflush(stdout);
// TODO how can I decide a more meaningfull size?
MilanLongInt size = numGhostVertices;
// Initialize the privte data structure
new (&privateU) staticQueue(NLVer + numGhostVertices); // TODO how can I put a meaningfull size?
new (&privateQLocalVtx) staticQueue(size);
new (&privateQGhostVtx) staticQueue(size);

Loading…
Cancel
Save