我正在比较一个顺序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/