我使用乘法循环中的隐式 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之间的不一致吗?
如果是这样,实现编译器独立性和兼容性的好方法是什么?