2017-02-21 9 views
0

Всякий раз, когда я запускаю этот код, он показывает мне разное время выполнения параллельного раздела. Я пытался с постоянным количеством потоков в соответствии с моим ядром, но все же усилия бесполезны. Программа предназначена для вычисления значения pi. Составлено с gcc -fopenmp.Изменение времени работы параллельной области OpenMP

#include <stdio.h> 
#include <omp.h> 

static long num_steps = 100000; double step; 
//double omp_get_wtime(void); 

int main(){ 
     int i; 
     double x,pi,max_threads,start,time; 
     double sum=0.0; 
     step = 1.0/(double) num_steps; 
    //omp_set_num_threads(4);  
     omp_get_max_threads(); 
     start=omp_get_wtime(); 

    #pragma omp parallel 
    { 

    #pragma omp for reduction(+:sum) schedule(static) private(x) //reduction to get local copy 
      for (i=0;i<num_steps;i++){ 
      x=(i+0.5)*step; 
      sum += 4.0/(1.0+x*x); 
      } 
    //max_threads=omp_get_max_threads(); 
    } 
time=omp_get_wtime()-start; 
pi=step*sum; 
printf("pi=(%f)\t run_time(%f)\n",pi,time);//,max_threads); 
return 0; 
} 
+2

Добро пожаловать в переполнение стека! Название вашего вопроса очень общее и никоим образом не отражает фактическую проблему. Пожалуйста, уделите время и прочитайте [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask) в разделе справки. –

+0

Для согласованного времени выполнения типичным требованием является привязка потоков и предотвращение конкуренции с другими задачами. Если вы делаете простое сокращение суммы и предотвращаете оптимизацию simd, задача не имеет большого значения. – tim18

ответ

0

код работает только несколько миллисекунд (на моей системе 2-6 мс), время доминированию над головой, например, для создания потоков. Серийная версия работает < 1 мс. Обычно такое короткое время выполнения является очень переменным, поскольку оно зависит от текущего состояния системы, например. существует некоторая «разминка».

В этом случае просто увеличьте num_steps, чтобы получить содержательные стабильные результаты. Например. с num_steps = 1000000000, 10 исполнений - от 4.332 до 4.399 секунд в моей системе.

Как правило, если вы выполняете измерения производительности, вы должны скомпилировать флаг -O3.