MPI_TEST (request, flag, status)

request коммуникационный запрос (дескриптор)
flag true, если операция завершена (логический тип)
status статусный объект (статус)

Обращение к MPI_TEST возвращает flag = true, если операция, указанная в запросе, завершена. В таком случае статусный объект содержит информацию о завершенной операции; если коммуникационный объект был создан неблокирующей посылкой или приемом, то он входит в состояние дедлока, и обработка запроса устанавливается в MPI_REQUEST_NULL. Другими словами, вызов возвращает flag = false. В этом случае значение статуса не определено. MPI_TEST яв­ляется локальной операцией.

Статусный объект для операции посылки несет информацию, которая может быть получена обращением к MPI_TEST_CANCELLED. Можно вызывать MPI_TEST с нулевым или неактивным аргументом запроса. В таком случае операция возвращает flag = true и empty для status.

Функции MPI_WAIT и MPI_TEST могут быть использованы как для завершения, так и для приема.

Пример. Простое использование неблокируемой операции.

CALL MPI_COMM_RANK(comm, rank, ierr) IF(rank.EQ.0) THEN

CALL MPI_ISEND(a(1), 10, MPI_REAL, 1, tag, comm, request, ierr)! выполним вычисления до завершения операции посылки

CALL MPI_WAIT(request, status, ierr) ELSE

CALL MPI_IRECV(a(1), 15, MPI_REAL, 0, tag, comm, request, ierr)! выполним вычисления до завершения операции приема

CALL MPI_WAIT(request, status, ierr) END IF

Семантика неблокирующих коммуникаций

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

Пример. Установление очереди для неблокирующих операций.

CALL MPI_COMM_RANK(comm, rank, ierr) IF (RANK.EQ.0) THEN

CALL MPI_ISEND(a, 1, MPI_REAL, 1, 0, comm, r1, ierr)

CALL MPI_ISEND(b, 1, MPI_REAL, 1, 0, comm, r2, ierr) ELSE

CALL MPI_IRECV(a,1,MPI_REAL,0,MPI_ANY_TAG, comm, r1, ierr)

CALL MPI_IRECV(b, 1, MPI_REAL, 0, 0, comm, r2, ierr) END IF

CALL MPI_WAIT(r1,status) CALL MPI_WAIT(r2,status)

Первая посылка процесса с номером 0 будет соответствовать первому приему процесса с номером 1, даже если оба сообщения посланы до того, как процесс с номером 1 выполнит тот или другой прием.

Продвижение обмена. Вызов MPI_WAIT, который завершает прием, будет в конечном итоге заканчиваться, если соответствующая посылка была начата и не закрыта другим приемом. Если соответствующая посылка неблокирующая, тогда прием должен завершиться, даже если отправитель не выполняет никакого вызова, чтобы завершить передачу. Аналогично, обращение к MPI_WAIT, которое завершает посылку, будет заканчиваться, если соответствующий прием инициирован.

Пример. Иллюстрация семантики продвижения.

CALL MPI_COMM_RANK(comm, rank, ierr) IF (RANK.EQ.0) THEN

CALL MPI_SSEND(a, 1, MPI_REAL, 1, 0, comm, ierr)

CALL MPI_SEND(b, 1, MPI_REAL, 1,1, comm, ierr) ELSE

CALL MPI_IRECV(a, 1, MPI_REAL, 0, 0, comm, r, ierr)

CALL MPI_RECV(b, 1, MPI_REAL, 0, 1, comm, ierr)

CALL MPI_WAIT(r, status, ierr) END IF

Первая синхронная посылка процесса с номером 0 обязана завершиться после того, как процесс с номером 1 установит соответствующий (неблокирующий) прием, даже если процесс 1 не достиг еще завершения вызова wait. Поэтому процесс с номером 0 будет продолжаться и выполнит вторую посылку, позволяя процессу 1 завершить передачу.

Если MPI_TEST, который завершает прием, вызывается повторно с тем же аргументом и соответствующая посылка стартовала, тогда вызов рано или поздно возвратит flag = true, если посылка не закрыта другим приемом. Если MPI_TEST, который завершает посылку, повторяется с тем же аргументом и соответствующий прием стартовал, тогда вызов рано или поздно возвратит flag = true, если не будет за­крыт другой посылкой.

2. Использование MPICH при выполнении MPI-программ.

Настройки VISUAL C++ для работы с MPICH

Чтобы создать новый проект mpich.nt с MS Visual Studio, после того, как уже инсталлирован mpich.nt, необходимо выполнить следующие действия:

1. Открыть MS Visual Studio - Visual C++.

2. Создать новый проект с любым желаемым именем и в любой директории. Самым простым проектом является консольное приложение Win32 без файлов в нем.

3. Закончить работу мастера по установке нового проекта.

4. Перейти на Project->Settings или нажать клавишу Alt F7, чтобы вызвать диалоговое окно настройки параметров нового проекта.

5. Установить параметры для использования многопоточных (multithreaded) библиотек. Установить указатели Debug и Release режимов.

6. Установить include путь для всех целевых конфигураций: Argonne National Lab\MPICH.NT.1.2.1\SDK\include.

7. Установить lib путь для всех целевых конфигураций: Argonne National Lab\MPICH.NT.1.2.1\SDK\lib.

8. Добавить для всех конфигураций библиотеку ws2_32.lib (Это библиотека Microsoft Winsock2 library. Она по умолчанию находится в вашем пути к библиотекам). Добавить mpich.lib в режим release и mpichd.lib в режим debug.

9. Закрыть диалоговое окно установки проекта. Добавить к проекту исходные файлы.

10. Build.

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

Отчет должен включать:

1. Цель работы.

2. Описание и листинг разработанной программы.

Отчет должен быть составлен в соответствии с общими требованиями и правилами оформления документов в учебном процессе.

Варианты заданий

Варианты заданий к лабораторной работе №1 представлены в таблицах 1 и 2.

Таблица 1

РАСЧЕТНАЯ ФОРМУЛА № ВАРИАНТА Используемые модули
A B C D
Y1 = (A+B)*(C –D) 1. M1 M4 M3 M7
Y2= A*(B – C) + D 2. M4 M3 M5 M8
Y3= A+ D + B + C 3. M5 M6 M2 M3
Y4 = A* D + B *C 4. M3 M7 M3 M1
Y5 = A*B*C*D 5. M1 M2 M3 M4
Y6 = (A –B)/(C +D) 6. M2 M3 M4 M5
Y7 = A/D + C*B 7. M3 M4 M5 M6
Y8 = D/ (A + B - C) 8. M4 M5 M6 M7

Таблица 2

МОДУЛЬ РАСЧЕТНАЯ ФОРМУЛА МОДУЛЬ РАСЧЕТНАЯ ФОРМУЛА
М1 104 1/104 S exp(-çxi-xi+1ú)*xi+2 i=1 М5 104 1/104 S xi sin xi+1 i=1
М2 105 Slg{1/[(xi-xi+1)2 + 1]} i=1 М6 104 1/104 S xi 2 sin xi+12 cos xi+22 i=1
М3 105 P(- xi2 - xi3+1+ xi+2) i=1 М7 104 1/104 S exp[sin (xi - 1)* xi+1*p] i=1
М4 105 1/105 S exp(xi3) i=1 М8 104 1/104 S xi cos xi+1 i=1
Для всех модулей xi – случайное число, равномерно распределенное на интервале [0 – 1]
         

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

1. Перечислите особенности системы программирования MPI.

2. Какие функции должны обязательно использоваться в MPI-программах.

3. Какие базовые операции посылки и приема используются в MPI.

4. Приведите примеры коллективных операций в MPI.

5. Примеры операций блокирующей передачи и блокирующего приема.

6. Примеры функций для буферизации сообщений.

7. Дайте определение неблокирующего обмена.

8. Приведите примеры операций неблокирующего обмена.

9. Приведите примеры функций неблокирующего обмена.

Рекомендуемая литература

1. Букатов А.А., Дацюк В.Н., Жегуло А.И.. Программирование многопроцессорных вычислительных систем. Ростов-на-Дону. Издательство ООО «ЦВВР», 2003, 208 с.

2. Параллельное программирование в стандарте MPI: Учебно-методическое пособие по выполнению лабораторных работ / В.М.Баканов, Д.В.Осипов. -М.: МГУПИ, 2006. –76 c.: ил.

3. Антонов А.С. Параллельное программирование с использованием MPI: Учебное пособие. – М.: Изд-во МГУ, 2004. – 71с.

4. Шпаковский Г.И., Серикова Н.В. Программирование для многопроцессорных систем в стандарте MPI. – Минск.: БГУ, 2002. – 323 с.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: