Распараллеливание Radix Sort OpenMP C - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть следующий алгоритм сортировки по основанию, который я пытаюсь распараллелить с помощью OpenMP:

void radixSortEdgesBySource(struct Edge *edges_sorted, struct Edge *edges, int numVertices, int numEdges) {

   int i, j, d, c;
   int key;
   int pos;
   int maximum = 0;

   int *vertex_cnt = (int*)malloc(numVertices*sizeof(int)); 

   maximum = edges[0].src;


   for (c = 0; c < numEdges; c++)
   {
       if (edges[c].src > maximum)
       {
           maximum  = edges[c].src;
       }
   }

   while(maximum != 0)
   {
       maximum /= 10;
       ++d;
   }


   for (j = 1; j < d; j++)
   {
       #pragma omp parallel for num_threads(4) 
       for(i = 0; i < numVertices; ++i) 
           vertex_cnt[i] = 0;
   }
       #pragma omp parallel for num_threads(4)
       for(i = 0; i < numEdges; ++i) 
       {
           key = edges[i].src;
           vertex_cnt[key]++;      
       }

       for(i = 1; i < numVertices; ++i) {
           vertex_cnt[i] += vertex_cnt[i - 1];
       }

       #pragma omp parallel for num_threads(4)
       for (i = numEdges - 1; i >= 0; --i) {
           key = edges[i].src;
           pos = vertex_cnt[key] - 1;
           edges_sorted[pos] = edges[i];
           vertex_cnt[key]--;
       }
   }
  free(vertex_cnt);
}

Я хочу знать, правильный ли способ, которым я использовал #pragma omp?Потому что я не вижу каких-либо значительных изменений в скорости выполнения.

А также, как бы я мог распараллелить блок цикла, который выполняет накопительное суммирование?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...