2014-10-22 2 views
-1
//serial enum sort 
double serial_enum_sort(int a[], int at[]) 
{ 
    double t1, t2; 
    t1 = omp_get_wtime(); 
    int k, i, j; 
    for(i = 1; i <= MAXN; i++) 
    { 
     k = 1; 
     for(j = 1; j <= MAXN; j++) 
      if(a[i] > a[j] || (a[i] == a[j] && i>j)) 
       k++; 
     at[k] = a[i]; 
    } 
    t2 = omp_get_wtime(); 
    return (t2 - t1); 
} 


// parallel enum sort 
double parallel_enum_sort(int b[], int bt[]) 
{ 
    double t1, t2; 
    t1 = omp_get_wtime(); 
    int k, i, j, id; 
    #pragma omp parallel private(k, i, j, id) 
    { 
     id = omp_get_thread_num()+1; 
     // printf("%d\n", id); 
     for(i = id; i <= MAXN; i += NUM_THREADS) 
     { 
      k = 1; 
      for(j = 1; j <= MAXN; j++) 
       if(b[i] > b[j] || (b[i] == b[j] && i > j)) 
        k++; 
      bt[k] = b[i]; 
     } 
    } 
    t2 = omp_get_wtime(); 
    return (t2 - t1); 
} 

это программа enum_sort с openmp. Я думаю, что bt [k] = b [i] будет стоить больше времени. Как я могу улучшить его? Мой компилятор gcc4.8.2 и моя ОС Linux MintOPENMP_why это так медленно в массиве записи, как я могу сделать это быстро?

ответ

0

Он смотрит на меня, как если бы вы объявили параллельную область, с прагмой

#pragma omp parallel private(k, i, j, id) 

но незаявленный все параллельные распараллеливания. Вы бы сделать это, возможно, заменив

for(i = id; i <= MAXN; i += NUM_THREADS) 

с

#pragma omp for 
for(i = id; i <= MAXN; i += NUM_THREADS) 

Как она стоит программу, которую вы показали нам выполняется параллельно, но все нити делают всю задачу - работа не поделили , Вы также можете написать одну прагму

#pragma omp parallel for private(k, i, j, id) 

и внести необходимые корректировки в остальную часть кода; например, оператор for должен находиться на следующей строке.

Примечание. Я не проверял, что ваш код без дальнейших изменений будет выполняться правильно и быстро.

+0

3q для вашего удивительного ответа! – svtter

+0

Ваш ответ неправильный. Его код делает работу. Это то же самое, что и pragma omp для расписания (static, 1) '. –

+0

Хммм ... мой ответ тоже не прав. Я прав о расписании (статический, 1), но остальная часть моего ответа - фиктивная. Жаль, что я не могу удалить принятый ответ. Сейчас мне придется это исправить. - Z boson 12 мин назад –

Смежные вопросы