2012-04-11 81 views
0

我实现为稀疏矩阵的简单矩阵向量乘法中使用CRS在乘法回路的隐式OpenMP指令。OpenMP的与限制指针失败,ICC而GCC/G ++成功

完整的代码是在GitHub上:https://github.com/torbjoernk/openMP-Examples/blob/icc_gcc_problem/matxvec_sparse/matxvec_sparse.cpp
注:这是丑陋;-)

要控制我使用限制指针私有和共享内存。与64位的Linux GCC 4.6.3编译它工作正常(除了约在printf命令%uunsigned int两次警告,但是这不是重点)。

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指令的定义:

然而,利用ICC 12.1.0编译它在64位的Linux与错误failes as

#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之间的不一致?
    如果是这样,那么实现编译器独立性和兼容性的好方法是什么?

回答

1

呵呵。看看代码,很明显icpc认为问题是什么,但我不确定没有通过规范说明哪个编译器在这里做正确的事情,g ++或icpc。

的问题不是restrict关键字;如果将所有这些选项全部丢失并将icpc的-restrict选项丢失,则问题依然存在。问题是你已经进入并行部分default(none) shared(n_row...),但在程序开始时n_row是指向default_n_row的指针。并且icpc要求default_n_row也在该omp并行部分中共享(或至少东西)。