我正在使用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。
答案 0 :(得分:1)
要添加到 Yurij Goncharuk's answer,您可以通过以下步骤为 CROSS_
变量找到合适的值,方法是为您喜欢的任何目标平台手动构建和运行一些程序。我不认为这些步骤特定于英特尔的编译器;您只需要工作的 C 和 Fortran(交叉)编译器和工作链接器。
作为参考,我使用 clang
和 gfortran
执行了这些步骤。程序本身改编自 configure
中包含的 mpich-3.3.2
脚本。
您应该构建并运行以下程序:
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
。
您应该构建并运行以下程序:
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
。
您应该构建并运行以下程序:
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
。
您应该构建并运行以下程序:
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
您应该构建并运行以下程序:
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
。
首先,您需要构建一个提供 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项目的官方邮件列表对解决问题没有任何帮助。希望我的发现对任何人都有帮助。