使用openMp进行矩阵乘法时的分段错误?

时间:2010-03-26 23:19:24

标签: c openmp

我的矩阵乘法码是

int matMul(int ld, double** matrix)
{ 

  //local variables initialize

  omp_set_num_threads(nthreads);


  \#pragma omp parallel private(tid,diag,ld) shared(i,j,k,matrix)

  {
    /* Obtain and print thread id */

    tid = omp_get_thread_num();

    for ( k=0; k<ld; k++)  {
    if (matrix[k][k] == 0.0) {
      error = 1;
      return error;
    }
    diag = 1.0 / matrix[k][k];
\#pragma omp for 

    for ( i=k+1; i < ld; i++) {

      matrix[i][k] = diag * matrix[i][k];

    }
    for ( j=k+1; j<ld; j++) {

      for ( i=k+1; i<ld; i++) {

        matrix[i][j] = matrix[i][j] - matrix[i][k] * matrix[k][j];

      }

    }
  } 

  }  
  return error;

}

我认为这只是因为矩阵对象,但为什么它会为null,即使它作为参数传递..

2 个答案:

答案 0 :(得分:1)

我在使用GCC 4.2在Linux下编译代码时遇到了同样的问题。导致问题的一行是:

omp_set_num_threads(nthreads);

您应该尝试通过在pragma omp下指定线程数来设置线程数:

#pragma omp for num_threads(nthreads)

希望它有所帮助!

答案 1 :(得分:0)

我假设你的“矩阵”是一个指向实际矩阵行的指针数组,如:

double *matrix[NROWS];
for (i = 0; i < NROWS; ++i) {
    matrix[i] = malloc(sizeof(double)*NCOL);
}

但如果以这种方式定义“矩阵”

double matrix[NROWS][NCOL];

你的程序无法正常工作。 如果你的矩阵id被正确定义,崩溃的可能原因可能是不正确的大小(“ld”)。

此致