openMp运行时的峰值

时间:2014-11-10 17:32:19

标签: c multithreading openmp

我将计算矩阵范数的顺序c程序的运行时间与使用openMp的多线程程序的运行时间进行比较。我从我的结果中产生了以下图表,这些图表通常与您期望的一样,但我不确定是什么产生了程序中的峰值,其中一些程序需要20倍的预期完成时间。这纯粹是为了产生多线程的开销吗?如果是这样,为什么开销有时比其他时间更多? Revised Graph of time to compute norm of a matrix

void matrix_norm(int n, double *z, double *norm){
    struct timeval tv1, tv2;
    struct timezone tz;
    int i, j;
    *norm = DBL_MAX*(-1.); 

    gettimeofday(&tv1, &tz);

    #pragma omp parallel for
    for(i=0; i<n; i++){
        double row_sum = 0.;
        #pragma omp parallel 
        for(j=0;j<n;j++)
            row_sum += z[i*n+j];
        #pragma omp critical
        {
            if(row_sum>*norm){
                *norm = row_sum;
            }
        }
    }
    gettimeofday(&tv2, &tz);
    double elapsed = (double) (tv2.tv_sec-tv1.tv_sec) + (double) (tv2.tv_usec-tv1.tv_usec) * 1.e-6;
    printf("%d %f\n",n, elapsed);
}

以下是使用Z boson的解决方案

的结果

Revised Graph of time to compute norm of a matrix

1 个答案:

答案 0 :(得分:0)

尝试以下功能

void matrix_norm(int n, double *z, double *norm){
    int i, j;
    double dtime, temp;
    temp = DBL_MIN;
    dtime = -omp_get_wtime();
    #pragma omp parallel for private(j) reduction(max:temp)
    for(i=0; i<n; i++) {
        double row_sum = 0.;
        for(j=0; j<n; j++)
            row_sum += z[i*n+j];
        if(row_sum>temp) {
            temp = row_sum;
        }
    }
    *norm = temp;
    dtime += omp_get_wtime();
    printf("%d %f\n",n, dtime);
}