Практикум по параллельному программированию с использованием электронного задачника Programming Taskbook for MPI
Покупка
Основная коллекция
Тематика:
Программирование и алгоритмизация
Издательство:
Южный федеральный университет
Автор:
Абрамян Михаил Эдуардович
Год издания: 2010
Кол-во страниц: 172
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-9275-0778-8
Артикул: 632645.01.99
Учебное пособие является практическим введением в параллельное программирование на основе технологии MPI. Оно содержит формулировки 100 заданий, связанных с различными разделами стандарта MPI-1.1, примеры выполнения типовых заданий на языках Паскаль и С++ и необходимый справочный материал. В пособии также описывается электронный задачник Programming Taskbook for MPI и конструктор учебных заданий по параллельному программированию.
Для преподавателей программирования и студентов.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Министерство образования и науки Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования «ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ» М. Э. Абрамян ПРАКТИКУМ ПО ПАРАЛЛЕЛЬНОМУ ПРОГРАММИРОВАНИЮ С ИСПОЛЬЗОВАНИЕМ ЭЛЕКТРОННОГО ЗАДАЧНИКА 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 — вторые числа, и т. д. В каждом процессе вывести числа в порядке возрастания рангов переславших их процессов (включая число, полученное из этого же процесса).