我将计算矩阵范数的顺序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 boson的解决方案
的结果
答案 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);
}