Вопрос:
Я изучаю MPI для параллельного программирования в C, и я использую процессор с 4 ядрами. Я пытаюсь сделать пример из учебника, в котором должен быть выход:
Hello world! I’m process 0 out of 4 processes Hello world! I’m process 2 out of 4 processes Hello world! I’m process 1 out of 4 processes Hello world! I’m process 3 out of 4 processes
В любом порядке.
Вот мой код:
#include <stdio.h> #include <mpi.h> int main(int argc, char** argv) { int ierr, num_procs, my_id; ierr = MPI_Init(&argc, &argv); ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); printf(«Hello world! I’m process %i out of %i processesn», my_id, num_procs); ierr = MPI_Finalize(); }
Я скомпилирую его, используя:
mpicc helloworld.c -o helloworld
И я запускаю его, используя:
mpirun -np 4 helloworld
Это то, что выдается:
Hello world! I’m process 0 out of 1 processes Hello world! I’m process 0 out of 1 processes Hello world! I’m process 0 out of 1 processes Hello world! I’m process 0 out of 1 processes
Он выводит его 4 раза, что является относительно хорошей новостью, я думаю, но программа не распознает количество потоков и каждого идентификатора потока.
Это даже работает параллельно или просто работает 4 раза в серийном режиме? Как я могу заставить программу правильно определить количество потоков и идентификатор потока?
Заранее спасибо!
Ответ №1mpicc helloworld.c -o helloworld mpirun -np 4 helloworld Hello world! I’m process 0 out of 1 processes Hello world! I’m process 0 out of 1 processes Hello world! I’m process 0 out of 1 processes Hello world! I’m process 0 out of 1 processes
Эта последовательность наглядно показывает нам, что среда выполнения MPI не смогла обнаружить параллельный запуск, вероятно, из-за неправильной конфигурации: ваш mpicc – из одной реализации MPI, а ваш mpirun – из другого. Например, как MPICH и OpenMPI имеют mpicc скрипты для компиляции программ MPI, но их mpiexec/mpirun программы несовместимы. Скомпилируйте с помощью MPICH, начиная с запуска OpenMPI и среды исполнения MPICH, не будут получать требуемые переменные среды для определения параллельного запуска и его параметров.
Вы должны пересмотреть список установленных пакетов (dpkg -l|egrep ‘mpich|openmpi’) и проверить, какой файл из какой библиотеки (dpkg -l mpich, dpkg -l openmpi-bin; dpkg -l libmpich-dev, dpkg -l libopenmpi-dev). Ubuntu/Debian также система “альтернатив”, которые будут устанавливать символические ссылки mpicc и mpirun фактических сценариев (у ls -l/usr/bin/mpicc/usr/bin/mpirun, чтобы увидеть текущее состояние ссылок). Проверьте инструмент update-alternatives, его страницу руководства и документы, чтобы узнать, как сбросить все сценарии, названные galternatives в одну реализацию (и для нее есть графический интерфейс galternatives).
Согласно спискам файлов в пакетах, mpich и openmpi имеют варианты mpirun/mpiexec с суффиксами http://packages.ubuntu.com/yakkety/amd64/openmpi-bin/filelist http://packages.ubuntu.com/yakkety/amd64/mpich/filelist:
/usr/bin/mpiexec.openmpi /usr/bin/mpirun.openmpi /usr/bin/mpiexec.hydra /usr/bin/mpiexec.mpich /usr/bin/mpirun.mpich
Такая же ситуация для сценариев mpicc: http://packages.ubuntu.com/yakkety/amd64/libopenmpi-dev/filelist http://packages.ubuntu.com/yakkety/amd64/libmpich-dev/filelist
/usr/bin/mpicc.openmpi /usr/bin/mpicc.mpich
Всегда используйте mpicc и mpirun (или mpiexec) из той же самой реализации. Вы также можете использовать варианты с суффиксом: mpicc.openmpi & mpiexec.openmpi pair или mpicc.mpich & mpiexec.mpich pair.
И чтобы использовать некоторую реализацию MPI, вы должны полностью ее установить, как для bin, lib, так и для dev-пакетов.