我正在尝试使用OpenMP将旋转与高斯消除并行化。
以下是我写的代码的相关部分:
struct timeval tvBegin, tvEnd;
gettimeofday(&tvBegin, NULL);
for (k=1; k<=n-1; ++k) {
amax = (double) fabs(a[k][k]) ;
m = k;
for (i=k+1; i<=n; i++){ /* Find the row with largest pivot */
xfac = (double) fabs(a[i][k]);
if(xfac > amax) {amax = xfac; m=i;}
}
if(m != k) { /* Row interchanges */
rowx = rowx+1;
temp1 = b[k];
b[k] = b[m];
b[m] = temp1;
for(j=k; j<=n; j++) {
temp = a[k][j];
a[k][j] = a[m][j];
a[m][j] = temp;
}
}
#pragma omp parallel for private(i,j)
for (i=k+1; i<=n; ++i) {
xfac = a[i][k]/a[k][k];
for (j=k+1; j<=n; ++j) {
a[i][j] = a[i][j]-xfac*a[k][j];
}
b[i] = b[i]-xfac*b[k];
} matrix_print_off (n, n, a);}
}
gettimeofday(&tvEnd, NULL);
printf("\nTime elapsed in ms: %d\n", diff_ms(tvEnd, tvBegin));
我用1000 * 1000矩阵测试了这段代码。在4核计算机上运行此代码(通过diff_ms测量)所花费的平均时间与此代码的顺序版本(没有编译指示)相同(2142ms)。由于这里发生了巨大的并行化,所以情况并非如此。能告诉我哪里出错了吗?
作为参考,我还附上了下面的diff_ms函数。
int diff_ms(struct timeval t1, struct timeval t2)
{
return (((t1.tv_sec - t2.tv_sec) * 1000) +
(t1.tv_usec - t2.tv_usec)/1000);
}
谢谢!
答案 0 :(得分:1)
在并行部分内,您有matrix_print_off()
。假设您的打印功能是线程安全的,这将显着减少您可以实现的并行度。此外,如果matrix_print_off()
使用阻塞IO,那么此函数的时间可能会占据您函数的其余部分。