c - OpenMP 中的高斯消除 - 无法并行化

标签 c parallel-processing openmp gaussian

我正在尝试使用 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);
}

谢谢!

最佳答案

在并行部分中,有matrix_print_off()。假设您的打印函数是线程安全的,这将显着减少您可以实现的并行度。此外,如果matrix_print_off()使用阻塞IO,那么该函数的时间可能会主导函数的其余部分。

关于c - OpenMP 中的高斯消除 - 无法并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14639664/

相关文章:

c - 如何释放()我的变量

c - 搜索链表中的某个节点

c - TCP/IP 套接字,读取错误? (Linux)

Delphi ITask - 完成后我应该释放它吗?

.net - c# 4.0 Parallel.For 需要任何特殊引用吗?

multithreading - omp_get_num_threads() 和 omp_get_thread_num() 返回废话

c++ - 如何在 XCode 7 中应用支持 OpenMP

c - 获取 DRAM 或 SRAM galaxy S7 的起始地址

scala - 创建括号平衡器的并行处理

c - 在 C OpenMP 中并行化函数