У меня та же проблема, и я обнаружил, что нет действительно хорошего способа заставить автоинструменты условно использовать компиляторы MPI для определенных целей. Autotools хорошо определяет, какой компилятор использовать, основываясь на том, на каком языке написан ваш исходный код (CC
, CXX
, FC
, F77
и т. д.), но на самом деле не очень хорошо определяет, использовать ли компилятор MPI для конкретной цели. Вы можете установить MPICC, MPICXX и т. д., но вам, по сути, придется переписать все ваши правила Makefile для вашей цели (как вы сделали выше), если вы используете компилятор таким образом. Если вы это сделаете, какой смысл писать файл automake?
Кто-то еще предложил использовать MPI как внешнюю библиотеку, и я бы рекомендовал именно этот подход, но вам не следует делать это вручную, потому что разные установки MPI имеют разные наборы флагов, которые они передают компилятору, и они могут зависеть от язык, который вы компилируете.
Хорошо то, что все поставляемые в настоящее время компиляторы MPI, которые я знаю, поддерживают аргументы самоанализа, такие как -show
, -show-compile
или -show-link
. Вы можете автоматически извлекать аргументы из скриптов.
Итак, что я сделал, чтобы справиться с этим, так это сделал m4
скрипт, который извлекает определения, включения, пути к библиотекам, библиотеки и флаги компоновщика из компиляторов MPI, а затем назначает их переменным, которые вы можете использовать в своем Makefile.am
. Вот сценарий:
lx_find_mpi.m4
Это заставляет MPI работать так, как этого ожидает automake. Кстати, именно этот подход использует CMake в своем FindMPI
, и я считаю, что там он работает достаточно хорошо. Это делает сборку намного удобнее, потому что вы можете просто сделать что-то подобное для своих целей:
bin_PROGRAMS = mpi_exe seq_exe
# This is all you need for a sequential program
seq_exe_SOURCES = seq_exe.C
# For an MPI program you need special LDFLAGS and INCLUDES
mpi_exe_SOURCES = mpi_exe.C
mpi_exe_LDFLAGS = $(MPI_CXXLDFLAGS)
INCLUDES = $(MPI_CXXFLAGS)
Аналогичные флаги есть и для других языков, поскольку, как я уже сказал, конкретные флаги и библиотеки могут различаться в зависимости от используемого компилятора MPI языка.
lx_find_mpi.m4
также устанавливает некоторые переменные оболочки, чтобы вы могли проверить в своем файле configure.ac
, был ли найден MPI. например, если вы ищете поддержку MPI C++, вы можете проверить $have_CXX_mpi
, чтобы увидеть, нашел ли ее макрос.
Я протестировал этот макрос с помощью mvapich и OpenMPI, а также пользовательскую реализацию MPICH2 на BlueGene (хотя это не решает всех проблем кросс-компиляции, которые вы там увидите). Дайте мне знать, если что-то не работает. Я хотел бы сохранить макрос как можно более надежным.
person
Todd Gamblin
schedule
19.10.2010