【问题标题】:Parallel code with OpenMP takes more time to execute than serial code使用 OpenMP 执行并行代码比执行串行代码需要更多时间
【发布时间】:2021-08-10 00:33:46
【问题描述】:

我正在尝试使此代码并行运行。这是来自一个大项目的一段代码。我以为我开始慢慢并行化,一步一步看是否有问题(我不知道这是否是一个好策略,所以请告诉我)。

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;
}

【问题讨论】:

    标签: c multithreading performance parallel-processing openmp


    【解决方案1】:

    目前,您的并行化程度并不高。您可以从并行化 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 当然很抱歉错过了!再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多