Запуск программ MPI с несколькими процессами с помощью Code::Blocks

#c #gcc #mpi #codeblocks

#c #gcc #mpi #codeblocks

Вопрос:

Я новичок в MPI и пытаюсь запустить программу «hello world». Вот моя программа

 #include <iostream>
#include <mpi.h>
using namespace std;


int main(int argc, char ** argv)
{
    int mynode, totalnodes;
    MPI_Init(amp;argc,amp;argv);
    MPI_Comm_size(MPI_COMM_WORLD, amp;totalnodes);
    MPI_Comm_rank(MPI_COMM_WORLD, amp;mynode);
    cout << "Hello world from process " << mynode;
    cout << " of " << totalnodes << endl;
    MPI_Finalize();
}
  

Вывод просто

Привет, мир, от процесса 0 из 1

У меня многоядерный процессор, и я думаю, что должно быть запущено не менее 4 процессов. Таким образом, вывод должен быть:

Привет, мир, из процесса 0 из 4 Привет, мир, из процесса 1 из 4 Привет, мир, из процесса 2 из 4 Привет, мир, из процесса 3 из 4

или что-то подобное. Кто-нибудь может прокомментировать, что я пропустил в программе или команде компиляции? Кстати, я использую компилятор Windows, MSMPI, gcc в среде IDE Code :: Blocks. Спасибо.

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

1. Как вы запускаете программу? Какова полная командная строка с mpirun?

Ответ №1:

У меня это сработало.

Я скопировал вставленный ваш код в mpi_app.cpp . mpicxx скрипт-оболочка компилятора, предоставляемый разработчиками MPI, который заботится о включениях и библиотеках. mpirun — это сценарий-оболочка для запуска программ mpi, который также предоставляется разработчиками MPI. Реализация MPI, которую я использую, — mpich2.

 $ mpicxx -O0 -o mpi_app mpi_app.cpp
$ mpirun -n 4 ./mpi_app
Hello world from procHello world from process 2 Hello world from process Hello world from process 0 oess 1 of 4
of 4
3 of 4
f 4
  

Примечание: «f 4» не является ошибкой копирования вставки. Когда несколько процессов записывают в стандартный вывод, следует ожидать искаженных или перемежающихся сообщений.

Похоже, вы получаете его для компиляции, но если нет, похоже, что в Windows вам нужно вручную добавить include и lib: http://blogs.msdn.com/b/risman/archive/2009/01/04/ms-mpi-with-visual-studio-2008.aspx

Из той же ссылки похоже, что команда в командной строке Windows:

 mpiexec –n 10 MyMPIProject.exe
  

Чтобы запустить это в code::blocks, вам нужно указать code::blocks для запуска команды, как указано выше. Из сообщения в блоге, приведенного ниже, похоже, что code::blocks использует ‘cb_console_runner.exe «для запуска скомпилированных программ. В этом сообщении в блоге есть модифицированная версия этой программы, которая будет принимать флаг -mpi, указывающий, где находится mpiexec .

http://www.blog.kubiak.co.uk/post/44

Установка флага -mpi:

«Аргумент’ который должен быть определен в меню Codeblocks в Project -> Установить аргументы программ?

 -mpi <path to mpiexec> -n <number of processes>
  

пример:

 -mpi C:/Progra~1/MPICH2/bin/mpiexec -n 8 
  

«

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

1. Я не использовал оболочку mpiexec.exe . Я использовал code:: blocks ide и просто указывал на каталоги. файлы для включения. Однако я не получаю желаемый результат (который вы получили).

2. Итак, вы действительно каким-то образом запускаете программу из code::blocks? Если это так, то где-то в настройках code::blocks должен быть способ изменить то, что выполняется code::blocks . code::blocks просто передается, не делая ничего особенного. Будь то через IDE или в командной строке, вы хотите, чтобы исполняемый файл был mpiexec с остальными в качестве аргументов. Возможно, стоит попробовать это в командной строке хотя бы один раз.

3. Я сделал то, что вы сказали в ссылке, и ваш подход работает! Спасибо! Однако, как я могу сделать это в code::blocks? Я имею в виду, что я не нашел ничего, чтобы использовать оболочку mpiexec.exe чтобы запустить программу. Есть комментарии?

4. Отредактированный ответ со ссылкой на то, как это сделать. Предостережение: у меня нет прямого опыта работы с code :: blocks, только MPI

5. Это сообщение в блоге немного сложно читать, но теперь, когда я снова смотрю, кажется, что он действительно опубликовал измененный cb_console_runner.exe и это вам понадобится, чтобы использовать флаг -mpi.