Привет, я использую OMP для распараллеливания моего кода.Я застрял с некоторыми зависимостями, я верю, однако я не уверен.В настоящее время мой код строит график для использования в алгоритме Дейкстры позже в моей программе.Я понимаю, что t является приватным для каждого потока, однако факт, что я использую rand (), генерирует различный набор чисел в каждом потоке, чем если бы я запускал его последовательно?Я спрашиваю об этом, потому что результаты, которые я получаю для моей последовательной версии, отличаются от моей параллели.Или я пропустил другую зависимость, которая вызывает изменение моего кода?
long linkCnt;
long i,j;
long t;
srand(randInit);
//Initialize Matrix
for(i = 0; i< G->N; i++)
{
linkCnt=0; //Keep track of # of outgoing edges
#pragma omp parallel for schedule(runtime) private(t)
for(j = 0; j < G->N; j++)
{
if(i == j){
t = NO_CONN;
} else {
t = (rand() % ((MAX_EDGE_WEIGTH-1) * 2)+1); //50% of having no connection
if(t > MAX_EDGE_WEIGTH){
//t = INF; //Like no connection
t = NO_CONN; //Like no connection
} else {
linkCnt++;
G->visited[j] = VISITED; //Do this to find isolated nods that have no incomming edge
}
}
G->node[i][j] = t;
}
//Be sure to only generate fully connected graphs by each node having at least one edge to someone else!
if(linkCnt == 0)
{
printf("Adding outgoing link for [%d]\n", i);
t = rand() % (G->N);
if(t == i) //NO self loops
t = (t*t)%G->N;
G->node[i][t] = rand() % (MAX_EDGE_WEIGTH);
}
}
}
Переменные выглядят так:
#define INF INT_MAX
#define NO_CONN -1
#define NOT_VISITED 1
#define VISITED 2
typedef struct {
long N; //Number of nodes
char** node; //Matrix of Nodes and connections
int* D; //Result of Dijkstra Algorithm. Shortest path length for each node.
char* visited; //Used to flag which nodes have been visted yet or not.
} graph;