我实现为稀疏矩阵的简单矩阵向量乘法中使用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
命令%u
和unsigned 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之间的不一致?
如果是这样,那么实现编译器独立性和兼容性的好方法是什么?