gpt4 book ai didi

c++ - 具有限制指针的 OpenMP 因 ICC 而失败,而 GCC/G++ 成功

转载 作者:行者123 更新时间:2023-11-28 08:07:02 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

嗯。查看代码,很明显 icpc 认为问题出在哪里,但如果不查看规范,我不确定哪个编译器在这里做的是正确的,g++ 还是 icpc。

问题不在于 restrict 关键字;如果您将所有这些都去掉并丢失 icpc 的 -restrict 选项,问题仍然存在。问题是你在那个并行部分 default(none) shared(n_row...),但是 n_row 在程序开始时是一个指向 default_n_row 的指针。 icpc 要求 default_n_row 也在该 omp 并行部分中共享(或者至少某事)。

关于c++ - 具有限制指针的 OpenMP 因 ICC 而失败,而 GCC/G++ 成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10103038/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com