2013-06-16 3 views
1

Я использую C++ & OpenMP для параллелизации алгоритма поиска выпуклого корпуса. Но я не могу получить ожидаемое ускорение. На самом деле последовательный алгоритм работает быстрее. Ввод & Выходной набор точек хранится в массивах.Последовательность быстрее, чем Multi threaded - OpenMp - C++

Не могли бы вы ознакомиться с кодом и сообщить мне об исправлениях?

Point *points = new Point[inp_size]; // contains the input 
    int th_id; 

    omp_set_num_threads(nthreads); 
    clock_t t1,t2; 
     t1=clock(); 
    #pragma omp parallel private(th_id) 
    { 
    th_id = omp_get_thread_num(); 
///////////// …. Only Function called …./////////////////////////////////// 
    findParallelUCHWOUP(points,th_id+1, nthreads, inp_size); 

    } 
    t2=clock(); 
    float diff ((float)t2-(float)t1); 
    float seconds = diff/CLOCKS_PER_SEC; 
    std::cout << "Time Elapsed in seconds:" << seconds << '\n'; 

/////////////////////////////////////////// ////////////////////

int findParallelUCHWOUP(Point iv[],int id, int thread_num, int inp_size){ 

    int numElems = inp_size/thread_num; 
     int first = (id-1) * numElems;; 
     int last; 
     if(id == thread_num){ 
      last = inp_size-1; 
     } 
     else{ 
      last = id*numElems-1; 
     } 

     output[first]=iv[first]; 
      std::stack<int> s; 
      s.push(first); 
      int i=first+1; 
     while(i<last){ 
      if (crossProduct(iv, i, first, last) > 0){ 
       s.push(i); 
       i++; 
       break; 
      }else{ 
       i++; 
      } 
     } 

     if(i==last){ 
      s.push(last); 
      return 0; 
     } 

     for(;i<=last;i++){ 
      if (crossProduct(iv, i, first, last) >= 0){ 
        while (s.size()>1 && crossProduct(iv, s.top(), second(s), i) <= 0){ 
         s.pop(); 
        } 
        s.push(i); 
      } 

     } 
      int count=s.size(); 
      sizes[id-1] = count; 
      while(!s.empty()){ 
       output[first+count-1]=iv[s.top()]; 
       s.pop(); 
       count--; 
      } 

    return 0; 
} 

/////////// протестирована на этих машинах /////

Последовательная время: 0,016466 Использование двух потоков: 0,022979 Используя четыре темы: 0,035213 Использование 8 потоков: 0,03315

машина используется: Mac Book Pro Процессор: 2,5 ГГц Intel Core i5 (по крайней мере 4 логических ядер) Память: 4 Гб 1600 МГц Компилятор: Mac OSX Компилятор

+0

Я не вижу определение 'output'. Это важная информация. –

+0

Вы также не определяете 'размеры' или' second'. Массив 'размеры', вероятно, более важны, поскольку он, вероятно, имеет проблему с ложным совместным использованием. –

ответ

1

Проблема заключается в том, как вы отсчета времени. Собственно, вы могли бы написать что-то вроде:

diff/(float) (CLOCKS_PER_SEC * nthreads) 

И это только приблизительное (и не всегда верно).
CLOCKS_PER_SEC означает сумму часов всех ядер ...
Лучше использовать специальные функции OpenMP ...

+0

Каков правильный способ измерения времени на C++ для измерения времени, затраченного многопоточными программами с помощью OpenMP? – user2491531

+0

Использовать omp_get_wtime –

+0

double t1 = omp_get_wtime(); ... ваш параллельный код ... double t2 = omp_get_wtime(); diff = t2 - t1; –

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