簡體   English   中英

使用 OpenMP 執行並行代碼比執行串行代碼需要更多時間

[英]Parallel code with OpenMP takes more time to execute than serial code

我正在嘗試使此代碼並行運行。 這是來自一個大項目的一段代碼。 我以為我開始慢慢並行化,以逐步查看是否存在問題(我不知道這是否是一個好策略,所以請告訴我)。

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

function 有更多的線,但它們在並行和串行之間是相同的。

看起來串行代碼平均需要 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 function 開始,因為它看起來對計算要求很高:

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

測試並檢查結果。 之后,您可以嘗試擴展並行化的 scope 以包括最外層循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM