Programming Taskbook


E-mail:

Пароль:

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

English

ЮФУ SMBU

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

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

 

PT for MPI-2 | Группы заданий | MPI2Send

PrevNext


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

Блокирующая пересылка данных

MPI2Send1°. В каждом подчиненном процессе дано целое число. Переслать эти числа в главный процесс, используя функции MPI_Send и MPI_Recv (стандартные блокирующие функции для передачи и приема сообщения), и вывести их в главном процессе. Полученные числа выводить в порядке возрастания рангов переславших их процессов.

MPI2Send2°. В каждом подчиненном процессе дано вещественное число. Переслать эти числа в главный процесс, используя функции MPI_Bsend (посылка сообщения с буферизацией) и MPI_Recv, и вывести их в главном процессе. Полученные числа выводить в порядке убывания рангов переславших их процессов. Для задания буфера использовать функцию MPI_Buffer_attach.

MPI2Send3°. В каждом подчиненном процессе даны четыре целых числа. Переслать эти числа в главный процесс, используя по одному вызову функции MPI_Send для каждого передающего процесса, и вывести их в главном процессе. Полученные числа выводить в порядке возрастания рангов переславших их процессов.

MPI2Send4°. В каждом подчиненном процессе дано целое число N (0 < N < 5) и набор из N целых чисел. Переслать данные наборы в главный процесс, используя по одному вызову функции MPI_Bsend для каждого передающего процесса, и вывести наборы в главном процессе в порядке возрастания рангов переславших их процессов. Для определения размера пересланного набора использовать функцию MPI_Get_count.

MPI2Send5°. В главном процессе дан набор вещественных чисел; количество чисел равно количеству подчиненных процессов. С помощью функции MPI_Send переслать по одному числу в каждый из подчиненных процессов (первое число в процесс 1, второе — в процесс 2, и т. д.) и вывести в подчиненных процессах полученные числа.

MPI2Send6°. В главном процессе дан набор вещественных чисел; количество чисел равно количеству подчиненных процессов. С помощью функции MPI_Bsend переслать по одному числу в каждый из подчиненных процессов, перебирая процессы в обратном порядке (первое число в последний процесс, второе — в предпоследний процесс, и т. д.), и вывести в подчиненных процессах полученные числа.

MPI2Send7°. В главном процессе дано целое число N и набор из N чисел; K − 1 ≤ N < 10, где K — количество процессов. С помощью функции MPI_Send переслать по одному числу их данного набора в процессы 1, 2, …, K − 2, а оставшиеся числа — в процесс K − 1, и вывести полученные числа. В процессе K − 1 для определения количества полученных чисел использовать функцию MPI_Get_count.

MPI2Send8°. В каждом подчиненном процессе дано целое число, причем только для одного процесса это число отлично от нуля. Переслать ненулевое число в главный процесс и вывести в главном процессе полученное число и ранг процесса, переславшего это число. Для приема сообщения в главном процессе использовать функцию MPI_Recv с параметром MPI_ANY_SOURCE.

MPI2Send9°. В каждом подчиненном процессе дано целое число N, причем для одного процесса это число больше нуля, а для остальных равно нулю. В процессе с ненулевым N дан также набор из N чисел. Переслать данный набор чисел в главный процесс и вывести в главном процессе полученные числа и ранг процесса, переславшего этот набор. При приеме сообщения использовать параметр MPI_ANY_SOURCE.

MPI2Send10°. В каждом подчиненном процессе дано целое число N, в главном процессе дано целое число K (> 0), равное количеству тех подчиненных процессов, в которых даны положительные числа N. Переслать все положительные числа N в главный процесс и вывести в нем сумму полученных чисел. Для приема сообщений в главном процессе использовать функцию MPI_Recv с параметром MPI_ANY_SOURCE.

MPI2Send11°. В каждом процессе дано вещественное число. Переслать число из главного процесса во все подчиненные процессы, а все числа из подчиненных процессов — в главный, и вывести в каждом процессе полученные числа (в главном процессе числа выводить в порядке возрастания рангов переславших их процессов). Для отправки сообщений использовать функцию MPI_Ssend.

Указание. Функция MPI_Ssend обеспечивает синхронный режим пересылки данных, при котором операция отправки сообщения будет завершена только после начала приема этого сообщения процессом-получателем. В случае пересылки данных в синхронном режиме возникает опасность взаимных блокировок (deadlocks) из-за неправильного порядка вызова функций отправки и получения сообщений.

MPI2Send12°. В каждом процессе дано целое число. С помощью функций MPI_Ssend и MPI_Recv осуществить для всех процессов циклический сдвиг данных с шагом 1, переслав число из процесса 0 в процесс 1, из процесса 1 в процесс 2, …, из последнего процесса в процесс 0. В каждом процессе вывести полученное число.

Указание. См. указание к задаче MPI2Send11.

MPI2Send13°. В каждом процессе дано целое число. С помощью функций MPI_Ssend и MPI_Recv осуществить для всех процессов циклический сдвиг данных с шагом −1, переслав число из процесса 1 в процесс 0, из процесса 2 в процесс 1, …, из процесса 0 в последний процесс. В каждом процессе вывести полученное число.

Указание. См. указание к задаче MPI2Send11.

MPI2Send14°. В каждом процессе даны два целых числа. С помощью функций MPI_Ssend и MPI_Recv переслать первое число в предыдущий процесс, а второе — в последующий процесс (для процесса 0 считать предыдущим последний процесс, а для последнего процесса считать последующим процесс 0). В каждом процессе вывести числа, полученные от предыдущего и последующего процесса (в указанном порядке).

Указание. См. указание к задаче MPI2Send11.

MPI2Send15°. В каждом процессе даны два числа: вещественное A и целое N, причем набор чисел N содержит все значения от 0 до K − 1, где K — количество процессов. Используя функции MPI_Send и MPI_Recv (с параметром MPI_ANY_SOURCE), выполнить в каждом процессе пересылку числа A в процесс N и вывести полученное число, а также ранг процесса, из которого число было получено.

Указание. Если значение N совпадает с рангом процесса, в котором оно дано, то требуемые результаты можно вывести, не вызывая функции библиотеки MPI. Такой способ надо обязательно применять при использовании MPICH2 версии 1.3 так как в этой версии вызов функции MPI_Send приводит к зависанию процесса-отправителя, если его ранг совпадает с рангом процесса-получателя.

MPI2Send16°. В каждом процессе дано целое число N, причем для одного процесса значение N равно 1, а для остальных равно 0. В процессе с N = 1 дан также набор из K − 1 числа, где K — количество процессов. Переслать из этого процесса по одному из чисел данного набора в остальные процессы, перебирая ранги получателей в возрастающем порядке, и вывести в каждом из них полученное число.

MPI2Send17°. В каждом процессе дан набор из K − 1 целого числа, где K — количество процессов. Для каждого процесса переслать по одному из данных в нем чисел в остальные процессы, перебирая ранги процессов-получателей в возрастающем порядке, и вывести полученные числа в порядке возрастания рангов переславших их процессов.

MPI2Send18°. Количество процессов — четное число. В каждом процессе дано целое число N (0 < N < 5) и набор из N чисел. С помощью функции MPI_Sendrecv выполнить обмен исходными наборами между парами процессов 0 и 1, 2 и 3, и т. д. В каждом процессе вывести полученный набор чисел.

MPI2Send19°. В каждом процессе дано вещественное число. С помощью функции MPI_Sendrecv_replace поменять порядок исходных чисел на обратный (число из процесса 0 должно быть передано в последний процесс, число из процесса 1 — в предпоследний процесс, …, число из последнего процесса — в процесс 0). В каждом процессе вывести полученное число.

MPI2Send20°. В каждом подчиненном процессе дано вещественное число A и его порядковый номер N (целое число); набор всех номеров N содержит все целые числа от 1 до K − 1, где K — количество процессов. Переслать числа A в главный процесс и вывести их в порядке, соответствующем возрастанию их номеров N. Массивы не использовать; для передачи номера N указывать его в качестве параметра msgtag функции MPI_Send.

MPI2Send21°. В каждом подчиненном процессе дано целое число L (≥ 0) и набор из L пар чисел (AN), где A — вещественное число, а N — его порядковый номер. Все числа L в сумме равны 2K, где K — количество процессов; набор номеров N, данных во всех процессах, содержит все целые числа от 1 до 2K. Переслать числа A в главный процесс и вывести их в порядке, соответствующем возрастанию их номеров N. Массивы не использовать; для передачи номера N указывать его в качестве параметра msgtag функции MPI_Send.

MPI2Send22°. В главном процессе дан набор пар чисел (T, A); количество пар равно числу подчиненных процессов. Число T — целое, равное 0 или 1. Число A — целое, если T = 0, и вещественное, если T = 1. Переслать по одному числу A в каждый из подчиненных процессов (первое число в процесс 1, второе — в процесс 2, и т. д.) и вывести полученные числа. Для передачи информации о типе пересланного числа указывать число T в качестве параметра msgtag функции MPI_Send, для получения этой информации использовать функцию MPI_Probe с параметром MPI_ANY_TAG.

Указание. Чтобы избежать дублирования кода, используйте вспомогательные шаблонные функции template<typename T> void send(int t, int dest, MPI_Datatype d) (для отправки данных) и template<typename T> void recv(MPI_Datatype d) (для получения данных). В качестве параметра t указывайте число, равное 0 или 1, в качестве параметра dest — ранг процесса-получателя.

MPI2Send23°. В каждом подчиненном процессе даны два целых числа T, N и набор из N чисел. Число T равно 0 или 1. Набор содержит целые числа, если T = 0, и вещественные числа, если T = 1. Переслать исходные наборы в главный процесс и вывести полученные числа в порядке возрастания рангов переславших их процессов. Для передачи информации о типе пересланного числа указывать число T в качестве параметра msgtag функции MPI_Send, для получения этой информации использовать функцию MPI_Probe с параметром MPI_ANY_TAG.

Указание. Чтобы избежать дублирования кода, используйте вспомогательные шаблонные функции template<typename T> void send(int t, MPI_Datatype d) (для отправки данных) и template<typename T> void recv(MPI_Datatype d, MPI_Status s) (для получения данных). В качестве параметра t указывайте число, равное 0 или 1, в качестве параметра s — результат, возвращенный функцией MPI_Probe.

MPI2Send24°. Количество процессов K является четным: K = 2N. В процессах четного ранга (0, 2, …, K − 2) дан набор из N вещественных чисел, в процессах нечетного ранга (1, 3, …, K − 1) — набор из N целых чисел. Используя функцию MPI_Sendrecv_replace, выполнить циклический сдвиг всех наборов вещественных чисел в направлении увеличения рангов процессов и циклический сдвиг всех наборов целых чисел в направлении уменьшения рангов (таким образом, вещественные наборы надо переслать из процесса 0 в процесс 2, из процесса 2 — в процесс 4, …, из процесса K − 2 — в процесс 0; целочисленные наборы надо переслать из процесса K − 1 в процесс K − 3, из процесса K − 3 в процесс K − 5, …, из процесса 1 в процесс K − 1). Вывести в каждом процессе полученные числа. Для определения рангов процессов-получателей использовать выражение, содержащее операцию % нахождения остатка от деления, в качестве ранга процесса-отправителя достаточно указывать константу MPI_ANY_SOURCE.

Указание. Чтобы избежать дублирования кода, используйте вспомогательную шаблонную функцию template<typename T> void sendrecv(int rank, int size, MPI_Datatype d, int step), где параметр step указывает величину сдвига, равную 2 для наборов вещественных чисел и −2 для целочисленных наборов.

MPI2Send25°. Количество процессов K является четным: K = 2N. В первой половине процессов дан набор целых чисел размера R + 1, где R — ранг процесса (R = 0, 1, …, N − 1), во второй половине процессов дан набор вещественных чисел размера 2N-R, где R — ранг процесса (R = N, N + 1, …, 2N − 1). Используя функцию MPI_Sendrecv, переслать исходные наборы из каждой половины процессов в соответствующий процесс другой половины (в частности, набор из процесса 0 надо переслать в процесс N, из процесса 1 — в процесс N + 1, из процесса N — в процесс 0, из процесса 2N − 1 — в процесс N − 1). Вывести в каждом процессе полученные числа.

Указание. Чтобы избежать дублирования кода, используйте вспомогательную шаблонную функцию template<typename T1, typename T2> void sendrecv(MPI_Datatype d1, int cnt1, int rank2, MPI_Datatype d2, int cnt2), где параметры d1 и cnt1 определяют характеристики процесса, вызвавшего функцию (тип элементов в наборе и их количество), а параметры rank2, d2, cnt2 — ранг и аналогичные характеристики процесса, с которым выполняется обмен данными.

Неблокирующая пересылка данных

MPI2Send26°. В каждом процессе дано целое число N; во всех процессах, кроме одного, значение N равно 0, в некотором выделенном процессе значение N равно 1. В выделенном процессе также дан набор целых чисел A размера K − 1, где K — количество процессов. Не сохраняя набор A в массиве, переслать по одному элементу этого набора из выделенного процесса во все остальные процессы, перебирая их в порядке возрастания рангов, и вывести в каждом процессе полученное число. Для пересылки данных использовать требуемое количество вызовов функций MPI_Issend (посылка сообщения в синхронном неблокирующем режиме) и MPI_Wait в выделенном процессе и функцию MPI_Recv в остальных процессах. Дополнительно отобразить в разделе отладки продолжительность каждого вызова функции MPI_Wait в миллисекундах; для этого вызвать функцию MPI_Wtime до и после MPI_Wait и с помощью функции Show вывести разность возвращенных функцией MPI_Wtime значений, умноженную на 1000. Проверить, как изменится отладочная информация, если вместо функции MPI_Issend использовать функцию MPI_Isend (посылка сообщения в стандартном неблокирующем режиме).

MPI2Send27°. В каждом процессе дано целое число N; в некотором выделенном процессе значение N равно −1, а в остальных процессах N является одинаковым и равно рангу R выделенного процесса. Во всех процессах, кроме выделенного, также дано вещественное число A. Переслать данные числа A в выделенный процесс и вывести их в порядке возрастания рангов процессов-отправителей. Для пересылки данных использовать требуемое количество вызовов функции MPI_Recv в выделенном процессе и функции MPI_Issend и MPI_Test в остальных процессах. Вызов функции MPI_Test повторять в цикле до тех пор, пока она не вернет ненулевой флаг, и отобразить в разделе отладки потребовавшееся количество итераций этого цикла, используя функцию Show. Проверить, как изменится отладочная информация, если вместо функции MPI_Issend использовать функцию MPI_Isend.

MPI2Send28°. В каждом процессе дано целое число N; в некотором выделенном процессе значение N равно −1, а в остальных процессах N является одинаковым и равно рангу R выделенного процесса. Во всех процессах, кроме выделенного, также дано вещественное число A. Переслать данные числа A в выделенный процесс и вывести их в порядке убывания рангов процессов-отправителей. Для пересылки данных использовать требуемое количество вызовов функций MPI_Irecv (прием сообщения в неблокирующем режиме) и MPI_Test в выделенном процессе и функцию MPI_Ssend в остальных процессах. После каждого вызова функции MPI_Irecv организовать цикл, в котором вызывать функцию MPI_Test, пока она не вернет ненулевой флаг, и отображать в разделе отладки потребовавшееся количество итераций этого цикла, используя функцию Show. Проверить, как изменится отладочная информация, если вместо функции MPI_Ssend использовать функцию MPI_Send.

MPI2Send29°. В каждом процессе дано целое число N; в некотором выделенном процессе значение N равно −1, а в остальных процессах N является одинаковым и равно рангу R выделенного процесса. Во всех процессах, кроме выделенного, также дано вещественное число A. Переслать данные числа A в выделенный процесс и вывести их сумму S. Для пересылки данных использовать требуемое количество вызовов функций MPI_Irecv и MPI_Waitany в выделенном процессе и функцию MPI_Ssend в остальных процессах. В выделенном процессе описать массив Q типа MPI_Request и организовать вызов функций MPI_Irecv в отдельном цикле, указывая для каждого вызова свой элемент массива Q. После выхода из этого цикла организовать второй цикл, в котором вызывать функцию MPI_Waitany и накапливать сумму S. Дополнительно на каждой итерации второго цикла отображать в разделе отладки следующие данные (используя по одному вызову функций Show и ShowLine): значение A, добавленное к сумме на данной итерации цикла, и ранг процесса, переславшего это значение.

MPI2Send30°. В каждом процессе дано целое число N; во всех процессах, за исключением двух, значение N равно 0; в одном из оставшихся процессов (процессе-отправителе) значение N равно 1, в другом (процессе-получателе) значение N равно 2. В процессе-отправителе также дано целое число R — ранг процесса получателя и набор A целых чисел размера K, где K — количество процессов. Не сохраняя набор A в массиве, переслать все его элементы процессу-получателю и вывести их в том же порядке. Для пересылки данных использовать единственный вызов функции MPI_Ssend_init и требуемое количество вызовов функций MPI_Start и MPI_Wait в процессе-отправителе и единственный вызов функции MPI_Recv_init и требуемое количество вызовов функций MPI_Start и MPI_Wait в процессе-получателе. Дополнительно отобразить в разделе отладки продолжительность каждого вызова функции MPI_Wait в миллисекундах (как для процесса-отправителя, так и для процесса-получателя); для этого вызвать функцию MPI_Wtime до и после MPI_Wait и с помощью функции Show вывести разность возвращенных функцией MPI_Wtime значений, умноженную на 1000. Проверить, как изменится отладочная информация, если вместо функции MPI_Ssend_init использовать функцию MPI_Send_init.

MPI2Send31°. В каждом процессе дано целое число N; в одном из процессов (процессе-получателе) значение N равно 2, в некоторых процессах (процессах-отправителях) значение N равно 1, в остальных процессах значение N равно 0. В каждом из процессов-отправителей также дано целое число R — ранг процесса-получателя и набор A целых чисел размера K, где K — количество процессов. В процессе-получателе дано целое число C — количество процессов-отправителей. Переслать все наборы A процессу-получателю и вывести набор S суммарных значений элементов всех наборов A с одинаковыми индексами (в порядке возрастания индексов). Для пересылки данных использовать единственный вызов функции MPI_Ssend в процессах-отправителях. В процессе-получателе описать массив Q типа MPI_Request и организовать вызов функций MPI_Recv_init в отдельном цикле, указывая для каждого вызова свой элемент массива Q. После выхода из этого цикла выполнить единственный вызов функции MPI_Startall и организовать второй цикл, в котором вызывать функцию MPI_Waitany и накапливать суммарные значения в массиве S. Дополнительно на каждой итерации второго цикла отображать в разделе отладки следующие данные (используя два вызова функции Show и один вызов ShowLine): продолжительность каждого вызова функции MPI_Waitany в миллисекундах, значение третьего параметра index, возвращенное функцией MPI_Waitany, и ранг процесса-отправителя, соответствующий параметру index. Для нахождения продолжительности вызвать функцию MPI_Wtime до и после MPI_Waitany и вычислить разность возвращенных функцией MPI_Wtime значений, умножив ее на 1000. Для нахождения ранга процесса-отправителя проанализировать значение последнего параметра (типа MPI_Status), возвращенного функцией MPI_Waitany.

MPI2Send32°. В каждом процессе дано целое число N; в одном из процессов (процессе-отправителе) значение N равно 1, в некоторых процессах (процессах-получателях) значение N равно 2, в остальных процессах значение N равно 0. В процессе-отправителе также дано вещественное число A, целое число C — количество процессов-получателей и набор целых чисел R размера C, содержащий ранги процессов-получателей. Переслать число A всем процессам-получателям и вывести его в каждом из этих процессов. Для пересылки данных использовать функцию MPI_Recv в процессах-получателях. В процессе-отправителе описать массив Q типа MPI_Request и организовать вызов функций MPI_Ssend_init в отдельном цикле, указывая для каждого вызова свой элемент массива Q. После выхода из этого цикла выполнить единственный вызов функции MPI_Startall и организовать второй цикл, в котором вызывать функцию MPI_Testany во вложенном цикле, пока она не вернет ненулевой флаг. Дополнительно на каждой итерации второго цикла отображать в разделе отладки следующие данные (используя по одному вызову функций Show и ShowLine): значение третьего параметра index, возвращенное функцией MPI_Testany (в ситуации, когда она вернула ненулевой флаг), и количество произведенных вызовов функции MPI_Testany (т. е. количество итераций вложенного цикла). Проверить, как изменится отладочная информация, если вместо функции MPI_Ssend_init использовать функцию MPI_Send_init.


PrevNext

 

Рейтинг@Mail.ru

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

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