Ошибки построения HPL

#build #mpi #openmpi #hpc #blas

#сборка #mpi #openmpi #hpc #blas

Вопрос:

Я безуспешно пытался создать HPL. Я установил Open MPI, и он работает правильно. У меня также есть библиотека BLAS. Но когда я пытаюсь собрать, я получаю некоторые ошибки, связанные с openmpi, я думаю. Например, я обнаружил, что «opal_install_dirs» является символом из libopen-pal. Но я не знаю, откуда берутся эти неопределенные ссылки, поэтому я не знаю, что делать, чтобы это исправить.

 fcoll_dynamic_file_write_all.c:(.text 0x20f0): undefined reference to `opal_output'
fcoll_dynamic_file_write_all.c:(.text 0x2122): undefined reference to `opal_output'
/usr/local/lib/libmpi.a(fcoll_dynamic_file_write_all.o):fcoll_dynamic_file_write_all.c:(.text 0x216e): more undefined references to `opal_output' follow
/usr/local/lib/libmpi.a(pinfo_create.o): In function `PMPI_Info_create':
pinfo_create.c:(.text 0x94): undefined reference to `opal_class_initialize'
/usr/local/lib/libmpi.a(ppack_external.o): In function `PMPI_Pack_external':
ppack_external.c:(.text 0xae): undefined reference to `opal_convertor_t_class'
ppack_external.c:(.text 0x129): undefined reference to `opal_convertor_prepare_for_send'
ppack_external.c:(.text 0x1ed): undefined reference to `opal_convertor_pack'
ppack_external.c:(.text 0x23c): undefined reference to `opal_class_initialize'
/usr/local/lib/libmpi.a(ppack_external_size.o): In function `PMPI_Pack_external_size':
ppack_external_size.c:(.text 0x7d): undefined reference to `opal_convertor_t_class'
ppack_external_size.c:(.text 0xf4): undefined reference to `opal_convertor_prepare_for_recv'
ppack_external_size.c:(.text 0x15c): undefined reference to `opal_class_initialize'
/usr/local/lib/libmpi.a(punpack_external.o): In function `PMPI_Unpack_external':
punpack_external.c:(.text 0xa2): undefined reference to `opal_convertor_t_class'
punpack_external.c:(.text 0x114): undefined reference to `opal_convertor_prepare_for_recv'
punpack_external.c:(.text 0x1d8): undefined reference to `opal_convertor_unpack'
punpack_external.c:(.text 0x22c): undefined reference to `opal_class_initialize'
/usr/local/lib/libmpi.a(pstatus_set_elements_x.o): In function `PMPI_Status_set_elements_x':
pstatus_set_elements_x.c:(.text 0xb2): undefined reference to `opal_datatype_set_element_count'
/usr/local/lib/libmpi.a(libdebuggers_la-ompi_debuggers.o): In function `check':
/home/snc/workspace/openmpi-2.0.1/ompi/debuggers/ompi_debuggers.c:146: undefined reference to `opal_argv_append_nosize'
/usr/local/lib/libmpi.a(libdebuggers_la-ompi_debuggers.o): In function `ompi_debugger_setup_dlls':
/home/snc/workspace/openmpi-2.0.1/ompi/debuggers/ompi_debuggers.c:171: undefined reference to `opal_install_dirs'
/home/snc/workspace/openmpi-2.0.1/ompi/debuggers/ompi_debuggers.c:172: undefined reference to `mca_base_var_register'
/home/snc/workspace/openmpi-2.0.1/ompi/debuggers/ompi_debuggers.c:181: undefined reference to `opal_argv_split'
/home/snc/workspace/openmpi-2.0.1/ompi/debuggers/ompi_debuggers.c:186: undefined reference to `opal_argv_free'
/usr/local/lib/libmpi.a(osc_rdma_frag.o):(.data.rel 0x8): undefined reference to `opal_free_list_item_t_class'
/usr/local/lib/libmpi.a(vprotocol_pessimist_event.o):(.data.rel 0x8): undefined reference to `opal_list_item_t_class'
collect2: error: ld returned 1 exit status
Makefile:76: recipe for target 'dexe.grd' failed
make[2]: *** [dexe.grd] Error 1
make[2]: Leaving directory '/home/mpiuser/cloud/hpl/testing/ptest/Linux_Intel64'
Make.top:64: recipe for target 'build_tst' failed
make[1]: *** [build_tst] Error 2
make[1]: Leaving directory '/home/mpiuser/cloud/hpl'
Makefile:72: recipe for target 'build' failed
make: *** [build] Error 2
  

Это только конечная часть вывода make.

В файле конфигурации для HPL у меня есть:

 MPdir        = /usr/local
MPinc        = $(MPdir)/include
MPlib        = $(MPdir)/lib/libmpi.a
...
LAdir        = /usr/lib/libblas
ifndef  LAinc
LAinc        = 
endif
ifndef  LAlib
LAlib        = $libblas.a
endif
...
# ----------------------------------------------------------------------
# - Compilers / linkers - Optimization flags ---------------------------
# ----------------------------------------------------------------------
#
CC       = mpicc
CCNOOPT  = $(HPL_DEFS)

CCFLAGS  = $(HPL_DEFS) -fomit-frame-pointer -O3 -funroll-loops -fopenmp
#
# On some platforms,  it is necessary  to use the Fortran linker to find
# the Fortran internals used in the BLAS library.
#
LINKER       = $(CC)
LINKFLAGS    = $(CCFLAGS)  
#
ARCHIVER     = ar
ARFLAGS      = r
RANLIB       = echo
  

Я пробовал разные варианты, исходя из информации, которую я нашел в нескольких сообщениях и форумах, и я преодолел некоторые другие предыдущие ошибки, но я не могу найти ничего, чтобы исправить эту. Может кто-нибудь увидеть, что может быть не так? Спасибо.

Комментарии:

1. Оболочка mpicc компилятора автоматически передаст правильные пути включения MPI и библиотеки базовому компилятору. Явная настройка MPinc и MPlib — это путь к катастрофе!

2. Я тоже пробовал это, но у меня все еще была проблема. Почему он установлен в каждой примерной конфигурации, которую я видел тогда?

3. Потому что не каждая реализация MPI предоставляет такие оболочки компилятора, а с некоторыми библиотека должна быть связана явно с использованием обычного компилятора и компоновщика. В Open MPI, Intel MPI, MPICH, MVAPICH и множестве других современных библиотек вы должны установить оба MPinc и MPlib в пустые строки.

Ответ №1:

Я решил проблему, просто используя libmpi.so вместо libmpi.a, но я не уверен, в чем разница. В большинстве примеров конфигурации, которые я видел ранее, использовалась библиотека *.a, за исключением одного, который использовал libmpi.so .

Комментарии:

1. mpicc уже передает все необходимые библиотеки компилятору и компоновщику. Используйте mpicc --showme , чтобы убедиться в этом сами. Открытый MPI разделен на несколько компонентов (OpenRTE, OPAL, MPI interface и т. Д.) И связывает их все динамически по умолчанию. libmpi.a является статическим интерфейсом MPI. Это зависит от статических версий других компонентов, а в вашем случае они не предусмотрены, отсюда и неразрешенные ошибки внешних символов (динамические и статические символы нельзя смешивать). Правильное решение — установить MPinc и MPlib очистить строки, а об mpicc остальном позаботиться.

Ответ №2:

Я решаю вопрос, устанавливая MPinc и MPlib в пустые строки

Комментарии:

1. Более подробное объяснение сделало бы этот ответ более полезным.