Корректное удаление отслуживших описателей

Здесь имеются в виду все типы системных данных, для которых предусмотрена функция 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
Используйте связь «точка-точка»
Используйте функции поддержки распределенных операций
Используйте функции коллективного обмена данными
Используйте точки синхронизации и свои коммуникаторы

 

Содержание отчета

  1. Титульный лист.
  2. Цель работы.
  3. Вариант задания.
  4. Блок-схема алгоритма.
  5. Текст программы.
  6. Выводы по работе.

Контрольные вопросы

  1. Для чего предназначен MPI?
  2. Категории функций в MPI.
  3. Виды коллективных функций в MPI.
  4. Основные особенности функций коллективного обмена данными.
  5. Что делают функции поддержки распределенных операций?
  6. Понятие группы и коммуникатора.
  7. Может ли задача обратиться к области связи, абонентом которой не является? Поясните свой ответ.
  8. Для чего служат барьеры?
  9. Понятие клинча.
  10. Функция 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 для начинающих. Учебное пособие.

Содержание

  1. Краткие теоретические сведения
  2. 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. Корректное удаление отслуживших описателей

  1. Задание
  2. Содержание отчета
  3. Контрольные вопросы
  4. Список литературы