Использование rand () c в OMP вызывает зависимости - PullRequest
0 голосов
/ 18 октября 2018

Привет, я использую 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;
...