Programming Taskbook


E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

 

ЮФУ SMBU

Электронный задачник по программированию

©  М. Э. Абрамян (Южный федеральный университет, Университет МГУ-ППИ в Шэньчжэне), 1998–2024

 

PT for MPI-2 | Разработка новых заданий | Дополнительные возможности конструктора заданий

PrevNext


Дополнительные возможности конструктора учебных заданий

В состав задачника PT for MPI-2 включен вариант конструктора учебных заданий PT4TaskMaker, позволяющий разрабатывать новые группы заданий на языке C++ в среде программирования Microsoft Visual Studio. Следует заметить, что имеются варианты конструктора учебных заданий и для других языков программирования (Delphi Pascal, PascalABC.NET и C#); все они входят в состав программного комплекса Teacher Pack for PT4 и позволяют разрабатывать новые задания, которые можно выполнять на любом из языков, поддерживаемых задачником. Однако, поскольку сам задачник PT for MPI-2 ориентирован на использование языка C++, представляется естественным разрабатывать задания на этом же языке.

Компоненты конструктора PT4TaskMaker содержатся в подкаталоге taskmaker каталога PTforMPI2, который, в свою очередь, находится в системном каталоге электронного задачника Programming Taskbook (обычно это каталог c:\Program Files (x86)\PT4).

Все средства конструктора для языка C++ реализованы в виде набора функций, определенного в файле pt4taskmaker.cpp; описания этих функций содержатся в заголовочном файле pt4taskmaker.h.

В следующих двух пунктах описываются те возможности конструктора PT4TaskMaker, которые связаны с разработкой заданий по параллельному программированию. Подробное описание конструктора PT4TaskMaker содержится в посвященном ему разделе сайта задачника Programming Taskbook. Изучить многие из возможностей конструктора можно по приводимым далее примерам их применения.

Следует отметить, что при разработке заданий по параллельному программированию не требуется использовать систему MPICH2.

Новый вариант функции CreateTask

void CreateTask(const char* SubgroupName, int* ProcessCount);
void CreateTask(std::string SubgroupName, int* ProcessCount);
void CreateTask(int* ProcessCount);

Функция CreateTask предназначена для инициализации задания. Приведенные выше перегруженные варианты этой функции предназначены для инициализации задания по параллельному программированию. Параметр SubgroupName имеет тот же смысл, что и для исходных вариантов функции: он определяет заголовок подгруппы, в которую включается задание, если разрабатываемую группу заданий целесообразно разбить на подгруппы. Если параметр SubgroupName является пустой строкой или отсутствует, то задание не связывается с какой-либо подгруппой.

В отличие от исходных вариантов функции CreateTask, новые варианты содержат дополнительный параметр ProcessCount. Этот параметр определяет количество процессов, которые будут использованы при инициализации задания в параллельном режиме.

Если параметр ProcessCount меньше или равен 1, то для инициализации задания используется соответствующий вариант функции CreateTask без данного параметра (при этом выходное значение параметра ProcessCount будет равно 1). Далее при описании функции CreateTask будем предполагать, что параметр ProcessCount имеет значение, большее 1.

Если параметр ProcessCount превосходит 36, то в окне задачника выводится сообщение об ошибке. Указанное максимально допустимое число процессов представляется достаточным для реализации любого учебного задания по параллельному программированию. К примеру, в заданиях, включенных в задачник PT for MPI-2, возможное число процессов не превосходит 16. Следует заметить, что при использовании в параллельном приложении существенно большего числа процессов заметно возрастает время начальной загрузки приложения.

Примечание. Выбор числа 36 в качестве максимально возможного количества процессов объясняется тем, что для обозначения любого из 36 процессов можно использовать единственный символ — цифру (0–9) для первых 10 процессов или латинскую букву (A–Z) для оставшихся 26 процессов, и это позволяет реализовать быстрый переход к требуемому процессу в разделе отладки по нажатию цифровой или буквенной клавиши, соответствующей этому процессу.

Для того чтобы в ходе тестирования параллельной программы с решением задачи использовалось различное количество процессов, рекомендуется при определении значения параметра ProcessCount применять датчик случайных чисел. В конструкторе для этих целей предусмотрена функция RandomN(int M, int N), возвращающая случайное целое число, лежащее в диапазоне от M до N (включительно). Выполнять особые действия по инициализации датчика случайных чисел не требуется, так как подобная инициализация выполняется автоматически в функции CreateGroup, которая инициализирует группу заданий. Если в задании налагается какое-либо ограничение на количество процессов (например, количество процессов всегда должно быть четным), то это ограничение также следует учитывать при генерации параметра ProcessCount.

Обратите внимание на то, что параметр ProcessCount передается как указатель, т. е. его значение может измениться в результате выполнения данной функции. Это связано с тем, что при выполнении задания по параллельному программированию запускаются несколько экземпляров учебной программы, причем каждый из них выполняет определенную роль в ходе инициализации параллельного задания. Напомним, что первой запускается непараллельная программа, выполняющая роль загрузчика. То значение параметра ProcessCount, которое будет в ней получено, используется при запуске программы в параллельном режиме. Экземпляры программы, запущенные в параллельном режиме, тоже вызывают функцию CreateTask, однако входное значение параметра ProcessCount им не требуется, так как параллельный режим уже запущен, и число процессов определено. Поэтому для процессов параллельного приложения параметр ProcessCount используется как выходной параметр, позволяющий определить фактическое количество запущенных процессов.

Следует также учитывать «неравноправие» процессов параллельного приложения при инициализации задания. Все необходимые исходные и контрольные данные определяются в главном процессе (процессе ранга 0), который затем автоматически пересылает каждому подчиненному процессу предназначенные для него данные. Таким образом, действия, связанные с инициализацией всех данных, входящих в задание, достаточно выполнять только в главном процессе параллельного приложения, тогда как в подчиненных процессах инициализация задания может (и должна) состоять лишь в вызове функции CreateTask. Как, однако, отличить главный процесс от подчиненного в функции, определяющей учебное задание? Для этого также используется возвращаемое значение параметра ProcessCount: для главного процесса он возвращает действительное количество процессов параллельного приложения, тогда как для подчиненных процессов всегда возвращается значение 0. Нулевое значение параметра ProcessCount означает, что никакие дополнительные действия, связанные с инициализацией учебного задания, в данном процессе выполнять не требуется.

Отметим, что нулевое значение параметра ProcessCount возвращается также в экземпляре непараллельной программы, выполняющей роль загрузчика. В самом деле, единственная «обязанность» этой программы состоит в определении числа процессов и использовании этого числа в качестве параметра приложения mpiexec.exe, запускающего параллельный вариант программы. Поэтому в программе-загрузчике, как и в программе, выполняемой в качестве подчиненного процесса параллельного приложения, действия по инициализации задания должны состоять только в вызове функции CreateTask.

Наконец, следует упомянуть о демонстрационном варианте программы с учебным заданием, который всегда выполняется в непараллельном режиме. При демонстрационном запуске программа выступает не в роли загрузчика, а в роли обычной непараллельной программы, в которой задание инициализируется и отображается в окне задачника. В этой ситуации выходное значение параметра ProcessCount всегда совпадает с его входным значением.

Все приведенные выше сведения, связанные с параметром ProcessCount, удобно представить в табличном виде.

«Роль» программы Входное значение параметра ProcessCount Выходное значение параметра ProcessCount
Непараллельная программа-загрузчик, обеспечивающая запуск параллельного варианта программы Используется: определяет число процессов при запуске параллельного варианта программы Всегда равно 0
Главный процесс параллельной программы (процесс ранга 0) Не используется Равно числу процессов в параллельной программе; используется при формировании входных и выходных данных
Подчиненный процесс параллельной программы Не используется Всегда равно 0
Непараллельная программа, обеспечивающая демонстрационный запуск учебного задания Используется Всегда равно входному значению; используется при формировании входных и выходных данных

Функция SetProcess

void SetProcess(int ProcessRank);

Данная функция устанавливает в качестве текущего процесса параллельного приложения процесс ранга ProcessRank. Все числовые исходные и контрольные данные связываются с текущим процессом. До первого вызова данной функции текущим процессом считается процесс ранга 0. Функцию SetProcess можно вызывать несколько раз с одним и тем же параметром (например, первый раз процесс делается текущим при определении связанных с ним исходных данных, а второй раз — при определении его контрольных данных).

Если какой-либо элемент исходных или контрольных данных связан с процессом ранга ProcessRank, то ввести или, соответственно, вывести этот элемент при выполнении задания можно будет только в этом процессе. Порядок ввода и вывода элементов в каждом процессе определяется, как обычно, порядком вызова соответствующих функций групп Data и Result, определяющих наборы исходных и контрольных данных, включаемых в задание. Для повышения наглядности следует всегда указывать в окне задачника комментарий вида «Процесс N:» перед теми исходными или результирующими данными, которые связаны с процессом ранга N.

Параметр ProcessRank должен принимать значения в диапазоне от 0 до K – 1, где K — количество процессов, возвращаемое параметром ProcessCount функции CreateTask. При нарушении этого условия выводится сообщение об ошибке «Параметр функции SetProcess находится вне диапазона 0..K–1, где K — количество процессов». Особое сообщение об ошибке будет выведено при попытке вызвать функцию SetProcess при выполнении подчиненного процесса параллельного приложения или непараллельной программы-загрузчика (напомним, что в этих режимах работы программы функция CreateTask возвращает в параметре ProcessCount значение 0, свидетельствующее о том, что выполнять дальнейшие действия по инициализации задания не требуется). В этом случае текст сообщения об ошибке будет следующим: «В ситуации, когда параметр ProcessCount функции CreateTask вернул значение 0, не выполнен немедленный выход из функции инициализации задания».

Функцию SetProcess можно вызывать и при формировании задания, не связанного с параллельным программированием. В подобной ситуации количество процессов всегда равно 1, допустимым значением параметра ProcessRank является только 0, и вызов функции SetProcess(0) не выполняет никаких действий.

Следует подчеркнуть, что с текущим процессом связываются только числовые данные. Данные прочих простых типов (логические, символьные, строковые, данные-указатели), а также все «внешние» данные (файлы и динамические структуры) остаются связанными с главным процессом параллельного приложения. Это ограничение объясняется тем, что, во-первых, основной областью применения параллельного программирования являются численные методы, и, во-вторых, для освоения возможностей библиотеки MPI вполне достаточно использования числовых данных (включая числовые массивы и структуры). Единственным исключением является появившаяся в MPI-2 возможность параллельного файлового ввода-вывода, для изучения которой необходимо включать в задание «внешние» файлы, а также их имена. Однако все подобные данные можно определять в главном процессе, при этом потребуется лишь организовать в начале выполнения учебной программы пересылку информации об имени файла во все подчиненные процессы. Именно по такому принципу реализованы все задания из задачника PT for MPI-2, связанные с файловым вводом-выводом (см. группу заданий MPI6File).


PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
01.01.2024