c - 使用 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 是#defined
该函数有更多的行,但它们在并行和串行之间是相同的。
看起来串行代码平均需要 130 秒,因此并行代码需要大约 400 秒。让我感到困惑的是,如此小的变化会导致 exe 时间的大幅增加。关于为什么会发生这种情况的任何想法?先感谢您!
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
函数开始,因为它看起来对计算要求很高:
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;
}
测试并检查结果。之后,您可以尝试扩展并行化的范围以包括最外层循环。
推荐阅读
- css - React Nivo 虚线
- powershell - 如何使用通配符包含路径复制目录的内容
- sql - 在 dbms_sql 的少数情况下,动态传递的索引提示失败
- python - Betfair - 比赛结束后的结果,未下注
- python - Python中正弦、余弦、正切函数的问题
- json - 如何在刀片 laravel 上获取 json 的值
- python - 如何将矢量(k1,k2)转换为体积中的RGBA(r,g,b,a)?
- javascript - 如何从javascript中获取变量并以不断的方式将其放入变量php中?
- java - Spring boot [s0] 连接到节点时出错(endPoint=127.0.0.1:9042,hostId=null,>
- f# - 插值三角形