使用 mpicxx 时由于 _noalias 导致 OpenMPI 构建失败

Posted

技术标签:

【中文标题】使用 mpicxx 时由于 _noalias 导致 OpenMPI 构建失败【英文标题】:Build failure of OpenMPI due to _noalias when using mpicxx 【发布时间】:2017-12-25 01:15:42 【问题描述】:

我尝试使用 11Aug17 的较新版本在我的部门机器上安装灯。但是,mpicxx 对以下行给出了错误:

mpicxx -g -O3   -DLAMMPS_GZIP -DLAMMPS_MEMALIGN=64  -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1   -I/home/shixx597/codes/kim-api-v1.7.3/lib/kim-api-v1/include  -c ../pair_list.cpp
../pair_list.cpp(88): error: expected a ";"
    const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0];
                            ^

../pair_list.cpp(89): error: "restrict" has already been declared in the current scope
    dbl3_t * _noalias const f = (dbl3_t *) atom->f[0];
             ^

../pair_list.cpp(89): error: expected a ";"
    dbl3_t * _noalias const f = (dbl3_t *) atom->f[0];
                      ^

../pair_list.cpp(114): error: identifier "x" is undefined
      const double dx = x[i].x - x[j].x;
                        ^

../pair_list.cpp(160): error: identifier "f" is undefined
          f[i].x += dx*fpair;
          ^

../pair_list.cpp(166): error: identifier "f" is undefined
          f[j].x -= dx*fpair;
          ^

compilation aborted for ../pair_list.cpp (code 2)
make[1]: *** [pair_list.o] Error 2
make[1]: Leaving directory `/home/shixx597/codes/lammps-11Aug17/src/Obj_mpi'
make: *** [mpi] Error 2

同事跟我说是openmpi的问题。所以我尝试为我安装一个新的 openmpi。但是,我收到以下错误,告诉我 automake 没有像这样安装:

 cd . && /bin/sh /home/shixx597/codes/openmpi-3.0.0/config/missing automake-1.15 --foreign
/home/shixx597/codes/openmpi-3.0.0/config/missing: line 81: automake-1.15: command not found
WARNING: 'automake-1.15' is missing on your system.
         You should only need it if you modified 'Makefile.am' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'automake' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [Makefile.in] Error 1

When I tried to install automake-1.15, I get the following error:
CDPATH="$ZSH_VERSION+.:" && cd . && "/home/shixx597/codes/automake-1.15/t/wrap/aclocal-1.15" 
Can't locate /home/shixx597/codes/automake-1.15/bin/aclocal in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/shixx597/codes/automake-1.15/t/wrap/aclocal-1.15 line 29.
make: *** [aclocal.m4] Error 2

我没有任何 sudo 权限在这台奇怪的部门机器上做任何事情。

即使我尝试在部门机器上完成安装灯,我也想知道我是否可以完成大型粘合力场模型的运行。

【问题讨论】:

如果我不得不猜测,听起来它无法识别 _noalias,这是使用英特尔编译器的 mpicxx 的一个已知问题。如果可以,请尝试将编译器更改为 GCC。您可以在本地安装各种编译器,以避免需要 sudo 权限。 lammps.sandia.gov/threads/msg58203.html 也许您可以添加CPPFLAGS=-D_noaliasCFLAGS=-D_noaliasCXXFLAGS=-D_noalias 或类似的方法来使用预处理器删除符号。 从 tarball 构建 Open MPI 时不需要 autotools。您可能弄乱了某些关键文件的时间戳make 认为应该再次调用 autotools。最简单的方法是清除您的源目录,解压缩源,然后再次configure &amp;&amp; make 【参考方案1】:

其实这是一个比较有名的issue,一共有三种解决方案。

    使用 GCC 而不是 Intel 编译器(可能不可取)。 在编译时使用-restrict 标志(我假设在运行make 时附加它,例如make CXX_FLAGS=-restrict 只需从构建中删除这两个文件即可。

如果您真的想尝试,您也可以尝试使用 sed 或 awk 从两个有问题的文件中删除 _noalias 关键字:pair_list.hpair_list.cpp,或者将 _noalias 定义为空关键字,正如 jww 在 cmets 中所建议的那样。

【讨论】:

非常感谢!我无法使用 GCC 编译器。我会尝试其他两种方法。圣诞快乐!

以上是关于使用 mpicxx 时由于 _noalias 导致 OpenMPI 构建失败的主要内容,如果未能解决你的问题,请参考以下文章

什么是 -lnuma 以及什么程序使用它进行编译?

Eigen中的noalias(): 解决矩阵运算的混淆问题

传递变量作为函数参数时由于隐式铸造导致的精度损失

使用 VPC 配置添加 AWS Lambda 会导致访问 S3 时超时

由于在 IAR 工作台中使用 GNU ARM 工具链而导致的错误

SSE _mm_load_ps 导致分段错误