Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Распараллеливание с помощью openmp


Автор: shonny 14.11.2017, 20:03
Здравствуйте, вообщем пытаюсь использовать Openmp, чтобы распараллелить задачу вычисления экспоненты с помощью ряда Тейлора. Программа работает, но при сравнении времени выполнения последовательного кода и с Openmp, нет прироста скорости, а даже наоборот выполняется дольше с Openmp. В чем может быть причина, не могли бы вы помочь?
Код

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
int fact(int c);
double taylor(double x, int n);
 
int main(int argc, char *argv[]) {
  double x=0;
  int n=0;
  int n_max = 32;
  if (argc != 3) {
  printf("Input three parametrs!\n");
  return 1;
}
  sscanf(argv[1], "%lf", &x);
  sscanf(argv[2], "%d", &n);
 
 if((n>n_max)||(n<0)) {
 printf("Invalid parameter n, enter n from 0..10\n");
 return 1;
 }
 
 int i;
 double sum=0 ;
 double t = omp_get_wtime();
 #pragma omp parallel for private(i) reduction(+: sum)
   for (i=1; i<=n; i++) {
      double taylor = pow(x,i)/fact(i);
      sum+=taylor;
  }
 
  double diff = omp_get_wtime() - t;
  printf("e^x = %lf\n Time: \t %lf\n", ++sum, diff);
  return 0;
}
 
int fact(int c) {
   int fact=1;
   int i;
   for (i = 1; i <= c; i++ ) {
      fact *=i;
   }
   return fact;
}

./taylor 1 32
e^x = 2.718282
Time: 0.000126 - время выполнения с openmp

/staylor 1 32
e^x = 2.718282
Time: 0.000020 - время выполнения последовательного кода

Автор: xvr 14.11.2017, 20:51
Распараллеливание цикла на 32 привара не даст. Количество итераций должно быть больше порядков на 5-6
У вас накладные расходы на создание потоков больше, чем работа, которая в них проводится

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)