Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Практикум по параллельному программированию с использованием электронного задачника Programming Taskbook for MPI

Покупка
Основная коллекция
Артикул: 632645.01.99
Доступ онлайн
65 ₽
В корзину
Учебное пособие является практическим введением в параллельное программирование на основе технологии MPI. Оно содержит формулировки 100 заданий, связанных с различными разделами стандарта MPI-1.1, примеры выполнения типовых заданий на языках Паскаль и С++ и необходимый справочный материал. В пособии также описывается электронный задачник Programming Taskbook for MPI и конструктор учебных заданий по параллельному программированию. Для преподавателей программирования и студентов.
Абрамян, М. Э. Практикум по параллельному программированию с использованием электронного задачника Programming Taskbook for MPI : учебное пособие / М. Э. Абрамян. - Ростов-на-Дону : Издательство ЮФУ, 2010. - 172 с. - ISBN 978-5-9275-0778-8. - Текст : электронный. - URL: https://znanium.com/catalog/product/549949 (дата обращения: 22.11.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
Министерство образования и науки Российской Федерации 

Федеральное государственное автономное образовательное  
учреждение высшего профессионального образования 
«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ» 

М. Э. Абрамян 

ПРАКТИКУМ  
ПО ПАРАЛЛЕЛЬНОМУ  
ПРОГРАММИРОВАНИЮ  
С ИСПОЛЬЗОВАНИЕМ  
ЭЛЕКТРОННОГО ЗАДАЧНИКА 
PROGRAMMING TASKBOOK FOR MPI 

Ростов-на-Дону 

Издательство Южного федерального университета 

2010 

УДК 681.3 
ББК 32.973 
        А 16 
 
 
Печатается по решению редакционно-издательского совета 
Южного федерального университета 
 
Рецензенты: 
Б. Я. Штейнберг, д. т. н., заведующий кафедрой алгебры и дискретной 
математики факультета математики, механики и компьютерных наук 
Южного федерального университета; 
С. С. Михалкович, к. ф.-м. н., доцент кафедры алгебры и дискретной 
математики факультета математики, механики и компьютерных наук 
Южного федерального университета: 
В. Н. Брагилевский, старший преподаватель кафедры информатики 
и вычислительного эксперимента факультета математики, механики 
и компьютерных наук Южного федерального университета 
 
Учебное пособие подготовлено и издано в рамках национального проекта «Образование» 
по «Программе развития федерального государственного  
образовательного учреждения высшего профессионального образования  
«Южный федеральный университет» на 2007-2010 гг.» 
 
Абрамян М. Э. 
А 16 
 
Практикум по параллельному программированию с использованием 
электронного задачника Programming Taskbook for MPI. – Ростов н/Д: Изд-во 
ЮФУ, 2010. — 172 с.: ил. 
 
ISBN 978–5–9275–0778–8 
 
Учебное пособие является практическим введением в параллельное 
программирование на основе технологии MPI. Оно содержит формулировки 100 
заданий, связанных с различными разделами стандарта MPI-1.1, примеры 
выполнения типовых заданий на языках Паскаль и С++ и необходимый 
справочный материал. В пособии также описывается электронный задачник 
Programming Taskbook for MPI и конструктор учебных заданий по 
параллельному программированию. 
Для преподавателей программирования и студентов. 
 
ISBN 978–5–9275–0778–8   
 
 
 
 
 
              УДК 681.3 
 
 
 
 
 
 
ББК 32.973 
 
 
 
 
© М. Э. Абрамян, 2010 
© Южный федеральный университет, 2010 
© Оформление. Макет. Издательство 
Южного федерального университета, 2010 

Предисловие 

Пособие является практическим введением в параллельное программирование на основе технологии MPI — интерфейса передачи сообщений 
(Message Passing Interface). В настоящее время данная технология является 
одной из основных технологий параллельного программирования для кластерных систем и компьютеров с распределенной памятью (см. [2–6]).  
В пособии рассматривается стандарт MPI версии 1.1 [7], используемый в 
большинстве современных программных реализаций. Данный стандарт 
ориентирован на языки C и Фортран, однако легко может быть перенесен 
на другие процедурные языки (имеется также ряд объектно-ориентированных реализаций стандарта MPI). В пособии используется стандартный интерфейс MPI для языков С/С++, а также его адаптация для языка Паскаль, 
выполненная автором.  

Для изучения основных компонентов MPI достаточно использовать 
локальный компьютер, имитируя на нем параллельное выполнение процессов. Однако даже в этом простейшем варианте учащийся неизбежно 
сталкивается с дополнительными трудностями при разработке параллельных программ, обусловленными сложностью организации ввода-вывода 
данных для различных процессов параллельной программы и невозможностью применения для параллельных программ стандартных отладочных 
средств, предусмотренных в интегрированных средах. Для того чтобы облегчить освоение технологии MPI, автор разработал специализированную 
учебную систему — электронный задачник по параллельному MPIпрограммированию Programming Taskbook for MPI (PT for MPI).  

Задачник PT for MPI включает большое число учебных заданий, связанных с различными разделами стандарта MPI-1.1. Задания по параллельному MPI-программированию могут выполняться на языках Паскаль и 
С++ в следующих программных средах: 

• Borland Delphi 7.0 и Turbo Delphi 2006; 
• Free Pascal Lazarus 0.9; 
• PascalABC.NET, 
• Microsoft Visual C++ 6.0; 
• Microsoft Visual Studio .NET 2003, 2005 и 2008. 
В качестве библиотеки MPI задачник использует динамическую библиотеку mpich.dll, входящую в состав комплекса MPICH for Windows 1.2.5 
— широко распространенной бесплатной реализации интерфейса MPI-1.1 
для операционной системы Windows. Для программ на С++ доступ к библиотеке обеспечивается с помощью файла mpich.lib и набора заголовочных 
файлов, также входящих в комплекс MPICH, а для программ на Паскале — 

с помощью модуля MPI.pas, специально разработанного для задачника PT 
for MPI. 

Задачник PT for MPI предоставляет при выполнении заданий те же 
возможности, что и базовый задачник Programming Taskbook; в частности, 
он передает программе учащегося исходные данные, проверяет правильность результатов, полученных программой, и сохраняет сведения о каждом тестовом испытании программы в специальном файле результатов. 
Кроме того, в задачнике PT for MPI предусмотрены дополнительные возможности, упрощающие и ускоряющие разработку и тестирование параллельных программ. Предполагается, что при изучении библиотеки MPI настоящее пособие будет использоваться совместно с задачником PT for MPI. 

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

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

Третья часть содержит справочные сведения. Она включает описание 
большинства типов, констант и функций интерфейса MPI-1.1, а также 
описание задачника PT for MPI.  

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

Часть I 

Учебные задания 
и примеры их выполнения 

1.  Формулировки учебных заданий 

Если количество процессов в задании не определено, то можно считать, что это количество не превосходит 12. Под главным процессом всюду 
в формулировках заданий понимается процесс ранга 0 для коммуникатора 
MPI_COMM_WORLD. Для всех процессов ненулевого ранга в заданиях 
используется общее наименование подчиненных процессов.  

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

Символом ° помечены задания, решения которых приводятся в п. 2–3. 

1.1.  Процессы и их ранги 
MPIBegin1°. В каждом из процессов, входящих в коммуникатор 
MPI_COMM_WORLD, прочесть одно целое число и вывести его удвоенное значение. Кроме того, для главного процесса (процесса ранга 0) 
вывести 
количество 
процессов, 
входящих 
в 
коммуникатор 
MPI_COMM_WORLD.  

MPIBegin2. В главном процессе прочесть вещественное число и вывести 
его противоположное значение, в каждом из остальных процессов 
(подчиненных процессов, ранг которых больше 0) вывести его ранг.  

MPIBegin3. В процессах четного ранга (включая главный) ввести целое 
число, в процессах нечетного ранга ввести вещественное число. В каждом процессе вывести удвоенное значение введенного числа.  

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

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

MPIBegin6. В каждом процессе дано целое число N (> 0) и набор из 
N чисел. В подчиненных процессах четного ранга вывести сумму чисел из данного набора, в процессах нечетного ранга вывести среднее 

Часть I. Учебные задания и примеры их выполнения 

арифметическое чисел из данного набора, в главном процессе вывести 
произведение чисел из данного набора.  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Часть I. Учебные задания и примеры их выполнения 

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

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

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

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

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

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

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

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

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

1.3.  Коллективная пересылка данных 
MPIBegin30. В главном процессе дано целое число. Используя функцию 
MPI_Bcast, переслать это число во все подчиненные процессы и вывести в них полученное число.  

MPIBegin31. В главном процессе дан набор из 5 чисел. Используя функцию MPI_Bcast, переслать этот набор во все подчиненные процессы и 
вывести в них полученные числа в том же порядке.  

MPIBegin32. В каждом процессе дано вещественное число. Используя 
функцию MPI_Gather, переслать эти числа в главный процесс и вывести их в порядке возрастания рангов переславших их процессов (первым вывести число, данное в главном процессе).  

MPIBegin33. В каждом процессе дан набор из 5 целых чисел. Используя 
функцию MPI_Gather, переслать эти наборы в главный процесс и вывести их в порядке возрастания рангов переславших их процессов 
(первым вывести набор чисел, данный в главном процессе).  

MPIBegin34. В каждом процессе дан набор из R + 2 целых чисел, где число R равно рангу процесса (в процессе 0 даны 2 числа, в процессе 1 
даны 3 числа, и т. д.). Используя функцию MPI_Gatherv, переслать эти 
наборы в главный процесс и вывести полученные наборы в порядке 
возрастания рангов переславших их процессов (первым вывести набор, данный в главном процессе).  

MPIBegin35. В главном процессе дан набор из K чисел, где K — количество процессов. Используя функцию MPI_Scatter, переслать по одному 
числу в каждый процесс (включая главный) и вывести в каждом процессе полученное число.  

Часть I. Учебные задания и примеры их выполнения 

MPIBegin36. В главном процессе дан набор из 3K чисел, где K — количество процессов. Используя функцию MPI_Scatter, переслать по 3 числа 
в каждый процесс (включая главный) и вывести в каждом процессе 
полученные числа.  

MPIBegin37. В главном процессе дан набор из K чисел, где K — количество процессов. Не меняя порядок расположения чисел в исходном наборе и используя функцию MPI_Scatterv, переслать по одному числу в 
каждый процесс; при этом первое число надо переслать в процесс K − 1, второе число — в процесс K − 2, …, последнее число — в 
процесс 0. Вывести в каждом процессе полученное число.  

MPIBegin38. В главном процессе дан набор из K(K + 3)/2 целых чисел, где 
K — количество процессов. Используя функцию MPI_Scatterv, переслать в каждый процесс часть чисел из данного набора; при этом в 
процесс ранга R надо переслать R + 2 очередных числа (в процесс 0 — 
первые два числа, в процесс 1 — следующие три числа, и т. д.). В каждом процессе вывести полученные числа.  

MPIBegin39. В главном процессе дан набор из K + 2 чисел, где K — количество процессов. Используя функцию MPI_Scatterv, переслать в каждый процесс три числа из данного набора; при этом в процесс ранга R 
должны быть пересланы числа с номерами от R + 1 до R + 3 (в процесс 0 — первые три числа, в процесс 1 — числа со второго по четвертое, и т. д.). В каждом процессе вывести полученные числа.  

MPIBegin40. В каждом процессе дано вещественное число. Используя 
функцию MPI_Allgather, переслать эти числа во все процессы и вывести их в каждом процессе в порядке возрастания рангов переславших 
их процессов (включая число, полученное из этого же процесса).  

MPIBegin41. В каждом процессе даны четыре целых числа. Используя 
функцию MPI_Allgather, переслать эти числа во все процессы и вывести их в каждом процессе в порядке возрастания рангов переславших 
их процессов (включая числа, полученные из этого же процесса).  

MPIBegin42. В каждом процессе дан набор из R + 2 целых чисел, где число R равно рангу процесса (в процессе 0 даны 2 числа, в процессе 1 
даны 3 числа, и т. д.). Используя функцию MPI_Allgatherv, переслать 
эти наборы во все процессы и вывести их в порядке возрастания рангов переславших их процессов (включая числа, полученные из этого 
же процесса).  

MPIBegin43. В каждом процессе дан набор из K чисел, где K — количество процессов. Используя функцию MPI_Alltoall, переслать в каждый 
процесс по одному числу из всех наборов: в процесс 0 — первые числа из наборов, в процесс 1 — вторые числа, и т. д. В каждом процессе 
вывести числа в порядке возрастания рангов переславших их процессов (включая число, полученное из этого же процесса).  

Доступ онлайн
65 ₽
В корзину