Я пытаюсь заставить этот код работать параллельно. Это кусок кода большого проекта. Я думал, что начал медленно распараллеливать, чтобы шаг за шагом увидеть, есть ли проблема (я не знаю, хорошая ли это тактика, поэтому, пожалуйста, дайте мне знать).
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;
}
В настоящее время вы не очень много распараллеливаете. Вы можете начать с распараллеливания функции
f
, поскольку она требует вычислительных ресурсов:Протестируйте и проверьте результаты. После этого вы можете попытаться расширить область распараллеливания, включив также самый внешний цикл.
@dreamcrash, конечно, жаль, что пропустил это! Еще раз, спасибо! — person dada dudu; 25.05.2021