我正在比较一个顺序c程序的运行时间,该程序计算矩阵的范数,与使用openMp的多线程的运行时间。我已经根据我的结果生成了下面的图表,这通常是您所期望的,但是我不确定是什么导致了程序中的峰值,有些程序的完成时间是预期的20倍。这纯粹是因为产生多个线程的开销吗?如果是这样,为什么有时开销比其他时候要大得多?

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玻色子解得到的结果

最佳答案

尝试以下功能

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

关于c - openMp运行时出现峰值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26849504/

10-17 00:24