Кросс-компиляция mpich-3.2 с коллекцией компиляторов Intel

Я использую коллекцию компиляторов Intel из Parallel Studio 2019 и пытаюсь собрать 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

Я погуглил об этом и нашел эту модель mpif90. h не инициализирован, поэтому макрос MPIR_F90_* не определен. Там было упомянуто в приведенной выше ссылке:

Точнее, двоичные файлы, которые должны запускаться и сообщать configure то, что он хочет знать, не могут связать, потому что configure пытается установить rpath.

Как я могу выполнить кросс-компиляцию MPICH-3.2 против компиляторов Intel, не отключая библиотеки fortran?

Я компилирую MPICH-3.2 в среде Docker с SLES 11 SP4 в качестве контейнерной ОС.


person Yurij Goncharuk    schedule 25.06.2019    source источник


Ответы (2)


Проблема была решена добавлением к /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},

Похоже, что configure из MPICH-3.2 не готов к сборке кросс-компилируемой версии без небольшой "магии". Официальная рассылка проекта MPICH не помогает решить проблему. Надеюсь, мое открытие кому-нибудь поможет.

person Yurij Goncharuk    schedule 26.06.2019

Чтобы добавить к ответ Юрия Гончарука, вот несколько шагов, которые вы можете предпринять, чтобы найти подходящие значения для переменных CROSS_, создав и запустив некоторые программы вручную для любой целевой платформы, которая вам нравится. Я не думаю, что эти шаги специфичны для компиляторов Intel; вам просто нужны работающие компиляторы C и Fortran (кросс-) и работающий компоновщик.

Для справки, я выполнил эти шаги с clang и gfortran. Сами программы были адаптированы из скрипта 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

Сначала вам нужно будет создать файл C, предоставляющий функцию cisize.

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

person fakedad    schedule 05.01.2021