Параллельный код с 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; }

Источник: ledsshop.ru

Стиль жизни - Здоровье!