Корректное удаление отслуживших описателей
Здесь имеются в виду все типы системных данных, для которых предусмотрена функция MPI_Xxx_free (и константа MPI_XXX_NULL). В MPI-I их 7 штук:
1. коммуникаторы;
2. группы;
3. типы данных;
4. распределенные операции;
5. квитанции (request's);
6. атрибуты коммуникаторов;
7. обработчики ошибок (errhandler's).
Дальше все описывается на примере коммуникаторов и групп, но изложенная схема является общей для всех типов ресурсов.
Не играет роли, в каком порядке уничтожать взаимосвязанные описатели. Главное - не забыть вызвать функцию удаления ресурса MPI_Xxx_free вовсе. Соответствующий ресурс не будет удален немедленно, он прекратит существование только если будут выполнены два условия:
ü программе пользователя никогда не предоставлялись ссылки на ресурс, или все пользовательские ссылки очищены вызовами MPI_Xxx_free ;
ü ресурс перестает использоваться другими ресурсами MPI, то есть удаляются все системные ссылки.
Взаимосвязанными описателями являются описатели коммуникатора и группы (коммуникатор ссылается на группу); или описатели типов, если один создан на базе другого (порожденный ссылается на исходный).
Пример:
MPI_Comm subComm;
MPI_Group subGroup;
int rank;
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_split( MPI_COMM_WORLD, rank / 3, rank % 3, &subComm );
/* Теперь создан коммуникатор subComm, и автоматически создана
* группа, на которую распространяется его область действия.
* На коммуникатор заведена ссылка из программы - subComm.
* На группу заведена системная ссылка из коммуникатора.
*/
MPI_Comm_group( subComm, &subGroup );
/* Теперь на группу имеется две ссылки - системная
* из коммуникатора, и пользовательская subGroup.
*/
MPI_Group_free( &subGroup );
/* Пользовательская ссылка на группу уничтожена,
* subGroup сброшен в MPI_GROUP_NULL.
* Собственно описание группы из системных данных не удалено,
* так как на него еще ссылается коммуникатор.
*/
MPI_Comm_free( &subComm );
/* Удалена пользовательская ссылка на коммуникатор,
* subComm сброшен в MPI_COMM_NULL. Так как других ссылок
* на коммуникатор нет, его описание удаляется из системных данных.
* Вместе с коммуникатором удалена системная ссылка на группу.
* Так как других ссылок на группу нет, ее описание удаляется
* из системных данных.
*/
Не стоит подобным образом уничтожать константные описатели вроде MPI_COMM_WORLD или MPI_CHAR: их создание и уничтожение – дело самого MPI.
Задание
1. Найдите в таблице 2 строку с номером Вашего варианта (Ваш номер в журнале) и выберите номера задания для таблиц 3 и 4.
Таблица 2
№ в журнале | Номер задания | |
по таблице 3 | по таблице 4 | |
2. Напишите параллельную программу на языке C++, создающую текстовый файл, содержащий координаты точек согласно заданию в таблице 3 с использованием функций MPI из задания в таблице 4 (в таблице указаны те функции, которые нужно использовать обязательно, это не ограничивает Вас в использовании других функций). Число точек задается пользователем. Координаты каждой точки следует записывать в выходной файл с новой строки, координаты (x, y) одной точки разделять пробелом. Обязательно следует выводить время выполнения программы.
Таблица 3
№ варианта | Задание – часть 1 |
Однородное (равномерное) заполнение круга точками. Для получения координат точек использовать генератор псевдослучайных чисел. | |
Регулярное заполнение квадрата точками. Точки должны быть расположены через равные промежутки (подобно клеткам в тетради). | |
«Случайное блуждание» – каждая следующая точка смещается от предыдущей в случайном направлении на фиксированное расстояние. Каждая ветвь параллельной программы «блуждает» из общей начальной точки самостоятельно. | |
Фрактал Фурнье – 5 точек составляют крест (4 на концах, одна – в центре), из таких крестов составляется более крупный крест, а из него еще более крупный, и т.д. (см. рис. 1). |
Рис. 1. Фрактал Фурнье
Таблица 4
№ варианта | Задание – часть 2 |
Используйте связь «точка-точка» | |
Используйте функции поддержки распределенных операций | |
Используйте функции коллективного обмена данными | |
Используйте точки синхронизации и свои коммуникаторы |
Содержание отчета
- Титульный лист.
- Цель работы.
- Вариант задания.
- Блок-схема алгоритма.
- Текст программы.
- Выводы по работе.
Контрольные вопросы
- Для чего предназначен MPI?
- Категории функций в MPI.
- Виды коллективных функций в MPI.
- Основные особенности функций коллективного обмена данными.
- Что делают функции поддержки распределенных операций?
- Понятие группы и коммуникатора.
- Может ли задача обратиться к области связи, абонентом которой не является? Поясните свой ответ.
- Для чего служат барьеры?
- Понятие клинча.
- Функция MPI_Finalize(). Где ее следует применять?
Список литературы
1. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. Изд БХВ, 2002г.
2. Немнюгин С., Стесик О. Параллельное программирование для многопроцессорных вычислительных систем. СПб:, БХВ, 2002г.
3. Коржов В. Linux и параллелизм, Открытые системы, 2003г. http://www.citforum.ru/operating_systems/linux/linux_parall/ .
4. Воеводин Вл.В. Технологии параллельного программирования. Message Passing Interface (MPI) http://parallel.srcc.msu.su/vvv/mpi.html .
5. Страуструп Б. Язык программирования С++.
6. Евсеев И. MPI для начинающих. Учебное пособие.
Содержание
- Краткие теоретические сведения
- MPI
2.1. Категории функций: блокирующие, локальные, коллективные
2.2. Принятая в MPI нотация записи
2.3. Обрамляющие функции. Начало и завершение
2.4. Связь "точка-точка"
2.5. Прием и передача: MPI_Sendrecv
2.6. Коллективные функции
2.7. Функции коллективного обмена данными
2.8. Точки синхронизации
2.9. Функции поддержки распределенных операций
2.10. Коммуникаторы
2.11. Корректное удаление отслуживших описателей
- Задание
- Содержание отчета
- Контрольные вопросы
- Список литературы