Как скомпилировать MPI с gcc?

Кто-нибудь знает, возможно ли скомпилировать MPI с помощью gcc?. Мне нужно использовать gcc, no mpicc.

5 ответов

mpicc - это просто обертка вокруг определенного набора компиляторов. В большинстве реализаций их обертки mpicc понимают специальную опцию, например -showme (Open MPI) или -show (Open MPI, MPICH и производные), которая предоставляет полный список опций, которые обертка передает на компилятор бэкэнд.

Например, в Open MPI обертки - это программы на С++, которые читают файлы конфигурации обычного текста и строят параметры командной строки, которые затем передаются компилятору. mpicc -showme показывает полный список таких параметров:

$ mpicc -showme
icc
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib
-lmpi
-ldl
-Wl,--export-dynamic
-lnsl
-lutil

(это действительно единственная строка, которую я разделил для улучшения удобочитаемости)

В этом конкретном случае Intel C Compiler icc используется в качестве компилятора бэкэнд, но у нас также есть варианты, которые используют GCC. Вы также можете получить список параметров, необходимых для фазы заполнения (обычно называемой CFLAGS) с помощью mpicc -showme:compile:

$ mpicc -showme:compile
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib

а также список параметров, которые необходимо передать в компоновщик (известный как LDFLAGS) с помощью mpicc -showme:link:

$ mpicc -showme:link
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib
-lmpi
-ldl
-Wl,--export-dynamic
-lnsl
-lutil

Они могут использоваться, например. в Makefile, например:

...
CFLAGS += $(shell mpicc -showme:compile)
LDFLAGS += $(shell mpicc -showme:link)
...

Насколько я знаю, -showme:compile и -showme:link специфичны для Open MPI, а другие реализации предоставляют полный список опций при вызове с помощью -show.

Я по-прежнему считаю, что лучше использовать mpicc напрямую, потому что, если произойдет, что что-то в настройке MPI будет изменено, оно будет немедленно отражено в оболочке, в то время как вам придется изменить свою конструкцию script/Makefile вручную (если вы не используете -showme:compile и -showme:link для автоматического получения параметров).


mpicc -compile_info для MPICH.


Да, вы можете скомпилировать программу MPI без удобства обертки mpicc. В большинстве реализаций mpicc - это оболочка script (или аналогичная), которая устанавливает переменные окружения, находит и связывает различные библиотеки, все виды материалов, которые вы могли бы поместить в Makefile.

Я предлагаю вам найти экземпляр mpicc script и деконструировать его.


mpicc уже использует gcc в качестве backend


Да, вы можете использовать gcc на самом деле. Но в моем случае (на Ubuntu) mpicc - всего лишь оболочка gcc, вот вывод команды mpicc -showme:

gcc -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include -I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -pthread -Wl,-rpath -Wl,/usr/lib/openmpi/lib -Wl,--enable-new-dtags -L/usr/lib/openmpi/lib -lmpi

Пока Открыть документы MPI:

Команда Open MPI настоятельно рекомендует просто использовать компиляторы Open MPI "wrapper" для компиляции ваших приложений MPI. То есть вместо использования (например) gcc для компиляции вашей программы используйте mpicc.

Повторяем приведенное выше утверждение: команда Open MPI настоятельно рекомендует использовать компиляторы-оболочки для компиляции и соединения приложений MPI. Если вы говорите: "Но я не хочу использовать компиляторы-обертки!", Пожалуйста, юмористируйте нас и попробуйте. Посмотрите, работают ли они на вас. Обязательно сообщите нам, если они не сработают для вас. Многие люди основывают свои "компиляторы-обертки"! менталитет о плохом поведении от плохо реализованных компиляторов оболочек в середине 1990-х годов. В наши дни все намного лучше; Компиляторы оболочки могут обрабатывать практически любую ситуацию и намного надежнее, чем вы пытаетесь жестко закодировать флаги компилятора и компоновщика Open MPI вручную. Тем не менее, существует несколько очень-очень мало ситуаций, когда использование компиляторов-оболочек может быть проблематичным - например, вложение нескольких компиляторов-оболочек из нескольких проектов. Следовательно, Open MPI обеспечивает обходное решение, чтобы выяснить, какие флаги командной строки вам нужны для компиляции приложений MPI.

Здесь этот ответ полезен для вас.

licensed under cc by-sa 3.0 with attribution.