【问题标题】:Cross-compile mpich-3.2 with Intel compilers collection使用英特尔编译器集合交叉编译 mpich-3.2
【发布时间】:2019-06-25 17:57:04
【问题描述】:

我正在使用 Parallel Studio 2019 中的 Intel 编译器集合,并尝试针对最近的 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 库的情况下针对英特尔编译器交叉编译 MPICH-3.2?

我在 Docker 环境中编译 MPICH-3.2,使用 SLES 11 SP4 作为容器操作系统。

【问题讨论】:

    标签: icc mpich


    【解决方案1】:

    问题已通过在/root/fort.types 后面附加以下变量得到解决:

    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-3.2 的 configure 还没有准备好在没有一点“魔法”的情况下构建交叉编译版本。 MPICH 项目的官方邮件列表对解决问题没有任何帮助。我希望我的发现对任何人都有帮助。

    【讨论】:

      【解决方案2】:

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

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


      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}。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-11
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2012-08-08
        • 2016-04-26
        相关资源
        最近更新 更多