交叉编译mpich-3.2与Intel编译器集合

时间:2019-06-25 17:57:04

标签: icc mpich

我正在使用Parallel Studio 2019中的英特尔编译器集合,并尝试针对它为最新的CPU构建MPICH-3.2。我的configure场景:

MPICHLIB_CFLAGS="-xCORE-AVX512" \
MPICHLIB_CXXFLAGS="-xCORE-AVX512" \
MPICHLIB_FCFLAGS="-xCORE-AVX512" \
MPICHLIB_FFLAGS="-xCORE-AVX512" \
LDFLAGS="-Wl,--disable-new-dtags" \
./configure \
CC="/opt/intel/bin/icc" \
CXX="/opt/intel/bin/icpc" \
FC="/opt/intel/bin/ifort" \
F77="/opt/intel/bin/ifort" \
--with-pic \
--enable-shared \
AR="ar" \ 
RANLIB="ranlib" \ 
--enable-f77 \
--enable-fc \
--enable-cxx \
--enable-fast=all,nompit \
--prefix=/usr \
--host=x86_64-pc-linux-gnu \
--with-cross=/root/fort.types

/root/fort.types包含:

CROSS_F77_SIZEOF_INTEGER=4
CROSS_F77_SIZEOF_REAL=4
CROSS_F77_SIZEOF_DOUBLE_PRECISION=8
CROSS_F77_TRUE_VALUE=1
CROSS_F77_FALSE_VALUE=0
CROSS_F90_ADDRESS_KIND=8
CROSS_F90_INTEGER_KIND=4

configure成功完成,但构建失败,并出现以下错误:

CC       src/glue/romio/lib_libmpi_la-all_romio_symbols.lo
src/binding/fortran/use_mpi/create_f90_real.c(75): error: expected an expression
    { MPIR_F90_REAL_MODEL, MPI_REAL},
                         ^

src/binding/fortran/use_mpi/create_f90_real.c(76): error: expected an expression
    { MPIR_F90_DOUBLE_MODEL, MPI_DOUBLE_PRECISION } };
                           ^

compilation aborted for src/binding/fortran/use_mpi/create_f90_real.c (code 2)
make[2]: *** [src/binding/fortran/use_mpi/lib_libmpi_la-create_f90_real.lo] Error 1
make[2]: *** Waiting for unfinished jobs....
src/binding/fortran/use_mpi/create_f90_complex.c(76): error: expected an expression
    { MPIR_F90_REAL_MODEL, MPI_COMPLEX},
                         ^

src/binding/fortran/use_mpi/create_f90_complex.c(77): error: expected an expression
    { MPIR_F90_DOUBLE_MODEL, MPI_DOUBLE_COMPLEX } };
                           ^

compilation aborted for src/binding/fortran/use_mpi/create_f90_complex.c (code 2)
make[2]: *** [src/binding/fortran/use_mpi/lib_libmpi_la-create_f90_complex.lo] Error 1
make[2]: Leaving directory `/root/mpich-3.2'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/mpich-3.2'
make: *** [all] Error 2

我对此进行了谷歌搜索,并发现mpif90model.h isn't initialized 并因此未定义宏MPIR_F90_*。在上面的链接中提到了:

  

更具体地说,应该运行并指示的二进制文件   配置它想知道的内容链接失败,因为配置尝试   设置rpath。

如何在不禁用fortran库的情况下针对Intel编译器进行交叉编译MPICH-3.2?

我在以SLES 11 SP4作为容器OS的Docker环境中编译MPICH-3.2。

2 个答案:

答案 0 :(得分:1)

要添加到 Yurij Goncharuk's answer,您可以通过以下步骤为 CROSS_ 变量找到合适的值,方法是为您喜欢的任何目标平台手动构建和运行一些程序。我不认为这些步骤特定于英特尔的编译器;您只需要工作的 C 和 Fortran(交叉)编译器和工作链接器。

作为参考,我使用 clanggfortran 执行了这些步骤。程序本身改编自 configure 中包含的 mpich-3.3.2 脚本。


CROSS_F90_OFFSET_KIND

您应该构建并运行以下程序:

      program main
      integer ii
      ii = selected_int_kind(16)
      open(8, file="conftest1.out", form="formatted")
      write (8,*) ii
      close(8)
      stop
      end

输出文件 conftest1.out 给出了您应该将 CROSS_F90_OFFSET_KIND 设置为的值。就我而言,我得到以下输出:

           8

因此,我设置了 CROSS_F90_OFFSET_KIND=8


CROSS_F90_REAL_MODEL

您应该构建并运行以下程序:

      program main
      real aa
      open(8, file="pac_fconftest.out", form="formatted")
      write(8,*) precision(aa), ",", range(aa)
      close(8)
      end

输出文件 pac_fconftest.out 给出了您应该将 CROSS_F90_REAL_MODEL 设置为的值。就我而言,我得到以下输出:

           6 ,          37

因此,我设置了 CROSS_F90_REAL_MODEL=6,37


CROSS_F90_DOUBLE_MODEL

您应该构建并运行以下程序:

      program main
      double precision aa
      open(8, file="pac_fconftest.out", form="formatted")
      write(8,*) precision(aa), ",", range(aa)
      close(8)
      end

输出文件 pac_fconftest.out 给出了您应该将 CROSS_F90_DOUBLE_MODEL 设置为的值。就我而言,我得到以下输出:

          15 ,         307

因此,我设置了 CROSS_F90_DOUBLE_MODEL=15,307


CROSS_F90_INTEGER_MODEL

您应该构建并运行以下程序:

      program main
      integer aa
      open(8, file="pac_fconftest.out", form="formatted")
      write(8,*) range(aa)
      close(8)
      end

输出文件 pac_fconftest.out 给出了您应该将 CROSS_F90_INTEGER_MODEL 设置为的值。就我而言,我得到以下输出:

           9

因此,我设置了 CROSS_F90_INTEGER_MODEL=9


CROSS_F90_ALL_INTEGER_MODELS

您应该构建并运行以下程序:

      program main
      integer r, lastkind
      lastkind=selected_int_kind(1)
      open(8, file="pac_fconftest.out", form="formatted")
      do r=2,30
         k = selected_int_kind(r)
         if (k .ne. lastkind) then
            write(8,*) r-1, ",", lastkind
            lastkind = k
         endif
         if (k .le. 0) then
            exit
         endif
      enddo
      if (k.ne.lastkind) then
         write(8,*) 31, ",", k
      endif
      close(8)
      end

输出文件 pac_fconftest.out 给出了您应该将 CROSS_F90_ALL_INTEGER_MODELS 设置为的值。就我而言,我得到以下输出:


           2 ,           1
           4 ,           2
           9 ,           4
          18 ,           8

因此,我设置了 CROSS_F90_ALL_INTEGER_MODELS=2,1,4,2,9,4,18,8


CROSS_F90_INTEGER_MODEL_MAP

首先,您需要构建一个提供 cisize 函数的 C 文件。

int cisize_(char *,char*);
int cisize_(char *i1p, char *i2p)
{
  int isize_val=0;
  isize_val = (int)(i2p - i1p);
  return isize_val;
}

然后,对于 CROSS_F90_ALL_INTEGER_MODELS 的输出中的每一行,让 $range 为第一个整数,让 $offset 为第二个整数。编译以下程序,用 $range$offset 替换给定的行,然后运行它。

      program main
      integer (kind=$kind) a(2)
      integer cisize
      open(8, file="pac_fconftest.out", form="formatted")
      write(8,*) $range, ",", $kind, ",", cisize( a(1), a(2) )
      close(8)
      end

为每一行运行此程序后,您可以将所有输出连接在一起。 (请记住,上面的程序每次都会输出到同一个文件 pac_fconftest.out。)在我的例子中,我的连接输出如下。

           2 ,           1 ,           1
           4 ,           2 ,           2
           9 ,           4 ,           4
          18 ,           8 ,           8

因此,我设置了 CROSS_F90_INTEGER_MODEL_MAP={2,1,1},{4,2,2},{9,4,4},{18,8,8}

答案 1 :(得分:0)

已通过向{"city": "rome", "post": "1000"} 附加以下变量解决了该问题:

/root/fort.types

MPICH-3.2中的CROSS_F90_OFFSET_KIND=8 CROSS_F90_REAL_MODEL=6,37 CROSS_F90_DOUBLE_MODEL=15,307 CROSS_F90_INTEGER_MODEL=9 CROSS_F90_ALL_INTEGER_MODELS=2,1,4,2,9,4,18,8, CROSS_F90_INTEGER_MODEL_MAP={2,1,1},{4,2,2},{9,4,4},{18,8,8}, 似乎还没有准备好在没有一点“魔术”的情况下构建交叉编译版本。 MPICH项目的官方邮件列表对解决问题没有任何帮助。希望我的发现对任何人都有帮助。