Лабораторная работа 9,10,11,12 Группа 22120 kif бекпулатов Жавлонбек
Скачать 272.77 Kb.
|
mpicc' используются команды 'mpif77' или 'mpif90' для Фортрана-77 и Фортрана-90 соответственно. Это скрипты, которые после соответствующей настройки окружения (пути к библиотекам и т.д.) вызывают стандартные компиляторы Фортрана. Вот пример на Фортране, взятый из MPI-UX. Надеюсь, Convex простит мне этот маленький плагиат. Обрамляющие функции. Начало и завершение. Существует несколько функций, которые используются в любом, даже самом коротком приложении MPI. Занимаются они не столько собственно передачей данных, сколько ее обеспечением: Инициализация библиотеки. Одна из первых инструкций в функции main (главной функции приложения): MPI_Init( &argc, &argv ); Она получает адреса аргументов, стандартно получаемых самой main от операционной системы и хранящих параметры командной строки. В конец командной строки программы MPI-загрузчик mpirun добавляет ряд информационных параметров, которые требуются MPI_Init. Это показывается в примере 0. Аварийное закрытие библиотеки. Вызывается, если пользовательская программа завершается по причине ошибок времени выполнения, связанных с MPI: MPI_Abort( описатель области связи, код ошибки MPI ); Вызов MPI_Abort из любой задачи принудительно завершает работу ВСЕХ задач, подсоединенных к заданной области связи. Если указан описатель MPI_COMM_WORLD, будет завершено все приложение (все его задачи) целиком, что, по-видимому, и является наиболее правильным решением. Используйте код ошибки MPI_ERR_OTHER, если не знаете, как охарактеризовать ошибку в классификации MPI. Нормальное закрытие библиотеки: MPI_Finalize(); Настоятельно рекомендуется не забывать вписывать эту инструкцию перед возвращением из программы, то есть: перед вызовом стандартной функции Си exit ; перед каждым после MPI_Init оператором return в функции main ; если функции main назначен тип void, и она не заканчивается оператором return, то MPI_Finalize() следует поставить в конец main. Две информационных функции: сообщают размер группы (то есть общее количество задач, подсоединенных к ее области связи) и порядковый номер вызывающей задачи: int size, rank; MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); Использование MPI_Init, MPI_Finalize, MPI_Comm_size и MPI_Comm_rank демонстрирует пример 0. Использование MPI_Abort будет показано далее, в примере 1. Связь "точка-точка". Простейший набор. Это самый простой тип связи между задачами: одна ветвь вызывает функцию передачи данных, а другая - функцию приема. В MPI это выглядит, например, так: Задача 1 передает: int buf[10]; MPI_Send( buf, 5, MPI_INT, 1, 0, MPI_COMM_WORLD ); Задача 2 принимает: int buf[10]; MPI_Status status; MPI_Recv( buf, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, &status ); Аргументы функций: Адрес буфера, из которого в задаче 1 берутся, а в задаче 2 помещаются данные. Помните, что наборы данных у каждой задачи свои, поэтому, например, используя одно и то же имя массива в нескольких задачах, Вы указываете не одну и ту же область памяти, а разные, никак друг с другом не связанные. Размер буфера. Задается не в байтах, а в количестве ячеек. Для MPI_Send указывает, сколько ячеек требуется передать (в примере передаются 5 чисел). В MPI_Recv означает максимальную емкость приемного буфера. Если фактическая длина пришедшего сообщения меньше - последние ячейки буфера останутся нетронутыми, если больше - произойдет ошибка времени выполнения. Тип ячейки буфера. MPI_Send и MPI_Recv оперируют массивами однотипных данных. Для описания базовых типов Си в MPI определены константы MPI_INT, MPI_CHAR, MPI_DOUBLE и так далее, имеющие тип MPI_Datatype. Их названия образуются префиксом "MPI_" и именем соответствующего типа (int, char, double, ...), записанным заглавными буквами. Пользователь может "регистрировать" в MPI свои собственные типы данных, например, структуры, после чего MPI сможет обрабатывать их наравне с базовыми. Процесс регистрации описывается в главе "Типы данных". Номер задачи, с которой происходит обмен данными. Все задачи внутри созданной MPI группы автоматически нумеруются от 0 до (размер группы-1). В примере задача 0 передает задаче 1, задача 1 принимает от задачи 0. Идентификатор сообщения. Это целое число от 0 до 32767, которое пользователь выбирает сам. Оно служит той же цели, что и, например, расширение файла - задача-приемник: по идентификатору определяет смысл принятой информации ; сообщения, пришедшие в неизвестном порядке, может извлекать из общего входного потока в нужном алгоритму порядке. Хорошим тоном является обозначение идентификаторов символьными именами посредством операторов "#define" или "const int". Описатель области связи (коммуникатор). Обязан быть одинаковым для MPI_Send и MPI_Recv. Статус завершения приема. Содержит информацию о принятом сообщении: его идентификатор, номер задачи-передатчика, код завершения и количество фактически пришедших данных. Лабораторная работа №11
При разработке параллельных алгоритмов решения задач вычислительной математики принципиальным моментом является анализ эффективности использования параллелизма, состоящий обычно в оценке получаемого ускорения процесса вычисления (сокращения времени решения задачи). Формирование подобных оценок ускорения может осуществляться применительно к выбранному вычислительному алгоритму (оценка эффективности распараллеливания конкретного алгоритма). Другой важный подход может состоять в построении оценок максимально возможного ускорения процесса получения решения задачи конкретного типа (оценка эффективности параллельного способа решения задачи). Операции алгоритма, между которыми нет пути в рамках выбранной схемы вычислений, могут быть выполнены параллельно. Возможный способ описания параллельного выполнения алгоритма может состоять в следующем [3]. Пусть есть количество процессоров, используемых для выполнения алгоритма. Тогда для параллельного выполнения вычислений необходимо задать множество (расписание) , (1.1) в котором для каждой операции указывается номер используемого для выполнения операции процессора и время начала выполнения операции Для того, чтобы расписание было реализуемым, необходимо выполнение следующих требований при задании множества : 1. , т.е. один и тот же процессор не должен назначаться разным операциям в один и тот же момент времени, 2. , т.е. к назначаемому моменту выполнения операции все необходимые данные уже должны быть вычислены [1]. Определение времени выполнения параллельного алгоритма Модель вычислительной схемы алгоритма совместно с расписанием может рассматриваться как модель параллельного алгоритма исполняемого с использованием процессоров. Время выполнения параллельного алгоритма определяется максимальным значением времени, используемым в расписании (1.2) Для выбранной схемы вычислений желательно использование расписания, обеспечивающего минимальное время исполнения алгоритма (1.3) Уменьшение времени выполнения может быть обеспечено и путем подбора наилучшей вычислительной схемы (1.4) Оценки и могут быть использованы в качестве показателей времени выполнения параллельного алгоритма. Кроме того, для анализа максимально возможной параллельности можно определить оценку наиболее быстрого исполнения алгоритма (1.5) Оценку можно рассматривать как минимально возможное время выполнения параллельного алгоритма при использовании не с бесконечным количеством процессоров, обычно называемой паракомпьютером, широко используется при теоретическом анализе параллельных вычислений). Оценка определяет время выполнения алгоритма при использовании одного процессора и представляет, тем самым, время выполнения последовательного варианта алгоритма решения задачи. Построение подобной оценки является важной проблемой при анализе параллельных алгоритмов, поскольку применяется для определения эффекта использования параллельности (ускорения времени решения задачи). Очевидно (1.6) Важно отметить, что если при определении оценки ограничиться рассмотрением только одного выбранного алгоритма решения задачи (1.7) то получаемые при использовании такой оценки показатели ускорения будут характеризовать эффективность распараллеливания выбранного алгоритма. Для оценки эффективности параллельного решения исследуемой задачи вычислительной математики величину следует определять с учетом всех возможных последовательных алгоритмов (1.8) (эффективный параллельный алгоритм может не совпадать с наилучшим последовательным методом при исполнении на одном процессоре) [8]. Показатели эффективности параллельного алгоритма Ускорение, получаемое при использовании параллельного алгоритма для процессоров, по сравнению с последовательным вариантом выполнения вычислений определяется (1.9) т.е. как отношение времени решения задач на скалярной ЭВМ к времени выполнения параллельного алгоритма (величина используется для параметризации вычислительной сложности решаемой задачи и может пониматься, например, как количество входных данных задачи). Эффективность использования параллельным алгоритмом процессоров при решении задачи определяется соотношением: (1.10) (величина эффективности определяет среднюю долю времени выполнения алгоритма, в течение которой процессоры реально используются для решения задачи). Как следует из приведенных соотношений, в наилучшем случае и . Кроме этого, существует понятие «парадокса параллелизма» – достижение ускорения и эффективности параллельного алгоритма, превышающих значения и , соответственно. Говоря другими словами, «парадокс параллелизма» – это более чем линейный рост производительности параллельной ВС с увеличением числа её вычислителей [1]. |