0

我使用乘法循环中的隐式 openMP 指令为CRS中的稀疏矩阵实现了一个简单的矩阵向量乘法。

完整的代码在 GitHub 中:https
://github.com/torbjoernk/openMP-Examples/blob/icc_gcc_problem/matxvec_sparse/matxvec_sparse.cpp 注意:很丑;-)

为了控制私有和共享内存,我使用了限制指针。%u在 64 位 Linux 上使用 GCC 4.6.3 编译它可以正常工作(除了两个关于命令和命令unsigned int的警告printf,但这不是重点)。

但是,在 64 位 Linux 上使用 ICC 12.1.0 编译它失败并出现以下错误:

matxvec_sparse.cpp(79): error: "default_n_row" must be specified in a variable list at enclosing OpenMP parallel pragma
    #pragma omp parallel \
    ^

有问题的变量和指针的定义

int default_n_row = 4;
int *n_row = &default_n_row;

和 openMP 指令定义为

#pragma omp parallel \
  default(none) \
  shared(n_row, aval, acolind, arowpt, vval, yval) \
  private(x, y)
{
  #pragma omp for \
    schedule(static)
  for ( x = 0; x < *n_row; x++ ) {
    yval[x] = 0;
    for ( y = arowpt[x]; y < arowpt[x+1]; y++ ) {
      yval[x] += aval[y] * vval[ acolind[y] ];
    }
  }
} /* end PARALLEL */

用 g++ 编译:

c++ -fopenmp -O0 -g -std=c++0x -Wall -o matxvec_sparse matxvec_sparse.cpp

用icc编译:

icc -openmp -O0 -g -std=c++0x -Wall -restrict -o matxvec_sparse matxvec_sparse.cpp

  • 使用 GCC/ICC 是否有错误?
  • 这是我的代码中的设计问题导致未定义的行为吗?
    如果是这样,哪条线路是/正在导致它?
  • 只是ICC和GCC之间的不一致吗?
    如果是这样,实现编译器独立性和兼容性的好方法是什么?
4

1 回答 1

1

嗯。查看代码,很清楚 icpc 认为问题出在哪里,但如果不仔细阅读规范,我不确定哪个编译器在这里做正确的事情,g++ 还是 icpc。

问题不在于restrict关键字;如果您将所有这些都排除在外并失去了-restricticpc的选择权,那么问题仍然存在。问题是你已经在那个并行部分default(none) shared(n_row...)中,但是n_row在程序开始时,它是一个指向default_n_row. icpc 要求在该 omp 并行部分中default_n_row也共享(或至少是某些东西)。

于 2012-04-11T13:37:04.063 回答