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

Я пытаюсь заставить этот код работать параллельно. Это кусок кода большого проекта. Я думал, что начал медленно распараллеливать, чтобы шаг за шагом увидеть, есть ли проблема (я не знаю, хорошая ли это тактика, поэтому, пожалуйста, дайте мне знать).

double best_nearby(double delta[MAXVARS], double point[MAXVARS], double prevbest, int nvars)
{
    double z[MAXVARS];
    double minf, ftmp;
    int i;
    minf = prevbest;
    omp_set_num_threads(NUM_THREADS);
    
    #pragma omp parallel for shared(nvars,point,z) private(i)
    for (i = 0; i < nvars; i++)
        z[i] = point[i];
    for (i = 0; i < nvars; i++) {
        z[i] = point[i] + delta[i];
        ftmp = f(z, nvars);
        if (ftmp < minf)
            minf = ftmp;
        else {
            delta[i] = 0.0 - delta[i];
            z[i] = point[i] + delta[i];
            ftmp = f(z, nvars);
            if (ftmp < minf)
                minf = ftmp;
            else
                z[i] = point[i];
        }
    }
    for (i = 0; i < nvars; i++)
        point[i] = z[i];

    return (minf);
}

NUM_THREADS # определено

У функции есть еще несколько строк, но они одинаковы для параллельной и последовательной.

Похоже, что последовательный код занимает в среднем 130 секунд, поэтому параллельный занимает около 400 секунд. Меня сбивает с толку, что такое небольшое изменение может привести к значительному увеличению времени выполнения. Есть идеи, почему это происходит? Заранее спасибо!

double f(double *x, int n){
double fv;
int i;

funevals++;
fv = 0.0;
for (i=0; i<n-1; i++)   /* rosenbrock */
    fv = fv + 100.0*pow((x[i+1]-x[i]*x[i]),2) + pow((x[i]-1.0),2);

return fv;
}

См. также:  Переключение функций ODE в Julia
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. dada dudu

    В настоящее время вы не очень много распараллеливаете. Вы можете начать с распараллеливания функции f, поскольку она требует вычислительных ресурсов:

    double f(double *x, int n){
    ..
      double fv = 0.0;
    
      #pragma omp parallel for reduction(+:fv)
      for (int i=0; i<n-1; i++)
           fv = fv + 100.0*pow((x[i+1]-x[i]*x[i]),2) + pow((x[i]-1.0),2);
    
       return fv;
    }
    

    Протестируйте и проверьте результаты. После этого вы можете попытаться расширить область распараллеливания, включив также самый внешний цикл.

    @dreamcrash, конечно, жаль, что пропустил это! Еще раз, спасибо! person dada dudu; 25.05.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: