Назад в библиотеку

Начало работы с MPI в Visual Studio 2008 Express

Автор: The Supercomputing Blog

Автор перевода: В.Складчиков
Источник: supercomputingblog.com


Привет, и добро пожаловать в моё первое руководство по MPI. Это руководство ориентировано на Visual Studio 2005 Express, Visual Studio 2005 Standard, Visual Studio 2008 Express, and Visual Studio 2008 Standard edition. Большая часть обучающего материала также может быть примененa в профессиональных версиях Visual Studio, с некоторыми незначительными отличиями.

Шаг 1. Загрузка Visual Studio 2008

Если у Вас еще нет установленной версии Visual Studio на Вашем компьютере, Вы можете загрузить бесплатную версию – Visual Studio 2008 Express. Это самая мощная развивающаяся среда разработки для ОС Windows. Загрузить можно здесь http://www.microsoft.com/exPress/download/.

Существует несколько версий Visual Studio 2008 Express. Т.к. данный блок ориентирован на высокопроизводительные вычисления, будем использовать С++ в Visual Studio.

Шаг 2. Загрузка HPC Pack 2008 SDK

Microsoft осознала, что большинство высокопроизводительных кластеров работает на Linux, поэтому был выпущен High Performance Computing Pack 2008 SDK. Этот SDK необходим если Вы будете использовать MPI. Обратите внимание, что MPI не зависит от платформы. Вы можете писать свои программы так, чтобы они работали на Windows, Linux, Mac OS, и любой другой операционной системе. Обычно я пишу программу в Visual Studio, и уже когда она готова для запуска на большом кластере, компилирую ее с GCC в Linux. Вы можете найти данный пакет, используя поисковик Google, или же скачать его по прямой ссылке www.microsoft.com/downloadS .

Шаг 3. Теперь, когда все установлено, можно создавать свой проект

Откройте Visual Studio, перейдите в меню File и выберите New–> Project. Появится диалоговое окно:

pic1

После указания имени проекта, нажмите ОК.

pic2

Отключите опцию Precompiled Header. Это, как правило, делает проект проще, с точки зрения копмиляции исходного кода, за исплючением Windows платформ.

Шаг 4. Запуск программы Hello World

#include "stdafx.h"

#include

using namespace std;

//int _tmain(int argc, _TCHAR* argv[])

int main(int argc, char* argv[])

{

cout << "Hello World\n";

return 0;

}

Идем дальше и изменяем исходный код так, как это выглядит в приведенном коде выше.

Составьте программу, и убедитесь, что она работает правильно. Есть несколько причин, мы изменили _tmain в стандартном объявлении функции main. Первая причина заключается в совместимости платформы. Вторая причина заключается в том, что нам нужно будет использовать в дальнейшем ARGV как символ *, а не как TCHAR *.

Шаг 5. Настройка проекта под MPI

Теперь, когда наша программа составлена и работает, мы должны будем подключить библиотеки MPI и файлы заголовков в наш проект. Щелкните правой кнопкой мыши на проект в обозревателе решений и выберите Свойства.

pic3

Вы должны будете перейти в каталог HPC Pack 2008 SDK, и подключить путь к каталогу в проект.

pic4

Далле необходимо убедиться, что MPI входит в проект

pic5

Теперь необходимо указать Visual Studio, что существует зависимость с библиотекой MPI.

Шаг 7. Изменяем исходный код под использование MPI

#include "stdafx.h"

#include

#include "mpi.h"

using namespace std;

//int _tmain(int argc, _TCHAR* argv[])

int main(int argc, char* argv[])

{

//cout << "Hello World\n";

int nTasks, rank;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&nTasks);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

printf ("Number of threads = %d, My rank = %d\n", nTasks, rank);

MPI_Finalize();

return 0;

}

Есть пара вещей,на которые я хотел бы обратить внимание.

Во–первых, мы включаем файл mpi.h. Есть в общей сложности четырех функций MPI, которые мы вызываем.

MPI_Init: эта функция должна всегда быть вызвана в начале программы. Просто передайте адрес для argc и argv. Убедитесь, что Вы изменили функцию _tmain, что argc имеет тип CHAR *. Эта функция в основном инициализирует MPI.

MPI_Comm_size: эта функция в основном дает ряд задач в любой коммуникационной группы. В настоящее время, мы будем использовать MPI_COMM_WORLD, который будет представлять собой совокупность всех различных потоков в нашей программе. Переменная nTasks будет равна общему количеству потоков в программе.

MPI_Comm_rank: каждый поток имеет уникальный идентификатор. Например, если ваша программа имеет четыре потока, потоки будут иметь значение ранга где–то между 0 и 3. Опять же, каждый поток будет иметь различный ранг, который отличает его от остальных потоков. Для того, чтобы определить, какой из рангов относится к определенному потоку, просто вызывать эту функцию.

MPI_Finalize: 'та функция очищает MPI, ее следует вызывать в конце работы программы.

Важная информация для пользователей Windows XP

Если вы используете Windows XP, то можете получить ошибку при выполнении шага 7.

pic6

Не паникуйте, это уже зафиксированная ошибка, и Вам просто нужно скачать исправления http://support.microsoft.com/....

Обратите внимание, что, поскольку это исправление не было полностью протестировано, Вам необходимо будет ввести свой адрес электронной почты, и Microsoft вышлем вам ссылку, где вы можете скачать файл. Письмо может появиться в Вашем спаме, как это было у меня. В письме будет содержаться информация о том, где Вы можете скачать исправление. Письмо также будет содержать пароль, который необходимо будет ввести, прежде чем применить исправление. Тем не менее, я могу сказать Вам, что исправления заработают с первого раза, даже не придется перезагрузить компьютер или что–нибудь другое. Просто убедитесь, что Dы закрываете все экземпляры программы до применения этого исправления.

Шаг 7. Получение программы, которая работает в нескольких потоках

Если Dы планируете скомпилировать и запустить программу сейчас, Вы увидите, что программа работает в одном потоке, даже если у Вас компьютер с двух или четырех ядерным процессором. Это проблема! Для того чтобы запустить MPI, вам нужно запустить программу через mpiexec.exe.

pic7

Нажмите кнопку Пуск и выберите Выполнить. Введите CMD и нажмите вод. И далее передвигаемся в каталог с проектом. Если Вы никогда не использовали командную строку, Вы можете изменить каталоги командой "CD ", получить список содержимого каталога "dir", и вернуться на каталог выше "CD..".

В директории проекта есть Mpiexec MPI_Tutorial_1.exe. На картинке выше, Вы увидите, что он работал с двумя потоками. В следующей команде, Вы видите, что, указав – n, Dы можете заставить вашу программу, начать с любым количеством потоков.

Если вы столкнулись с ошибкой при попытке запустить программу с mpiexe, пожалуйста прокрутки вверх и прочитать о проблеме с Windows XP, и как ее решить путем применения исправлений.

Шаг 8. Запуск программы без использования командной строки

Не было бы неплохо, если бы нам не приходилось использовать командную строку каждый раз, когда мы захотим запустить нашу программу? Ну, мы можем настроить Visual Studio делать это автоматически. Щелкните правой кнопкой мыши на окне обозревателя решений, выберите проект, щелкните правой кнопкой мыши и выберите свойства.

Примечание для пользователей Visual Studio Professional: если у вас есть профессиональная версия Visual Studio 2005 или 2008 года, вам повезло. выбрав раздел Отладки, Вы можете выбрать "отладчик для запуска" из выпадающего списка. Если вы видите MPI Cluster отладку, или нечто подобное, то Вам обязательно необходимо это использовать. Это дает много преимуществ по сравнению с экспресс и стандартной конфигурации Visual Studio. Эти преимущества будут рассмотрены в последующих учебниках. Если вы используете экспресс или стандартную версию Visual Studio, не паникуйте. Пожалуйста, следуйте приведенным ниже пояснениям, чтобы настроить вашу программу под запуск из под Visual Studio.

pic8

Делаем команду mpiexec.exe целевой. Как параметры командной строки, Вы можете указать количество процессоров, которое Вы хотите. Вы можете включить свой целевой путь в кавычки. Идем дальше и нажмите кнопку Применить и Запуск проекта. Visual Studio должна скомпилировать и запустить программу так же, как это было раньше!

И еще...

Это был захватывающий день! Вы смогли создать проект с нуля, и изменить его для запуска MPI. Конечно, есть много подготовительной работы, но оно того стоило. Есть много опущенных моментов, которые будут обсуждаться, в том числе, как отлаживать вашу программу. Этот вопрос и другие будут рассматриваться в следующем уроке.