Как распараллелить программу на c mpi

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

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

Вот структура кода:

int main()

и функция « function_to_parallelize «:

function_to_parallelize(data1, data2, data3, array_global) < int i; for (i = 0;iwrite(file4, array_global); >

Мой первый вопрос: могу ли я выполнить распараллеливание MPI, выполнив rank_mpi а также nb_process аргументы):

int main() < int rank_mpi, nb_process; MPI_Init(argv); MPI_Comm_rank(MPI_COMM_WORLD, MPI_Comm_size(MPI_COMM_WORLD, double *array_global; data1 = read(file1); data2 = read(file2); data3 = compute_on_data(data1, data2); if (rank_mpi = 0) < write(file3,data3);>function_to_parallelize(data1, data2, data3, *array_global, rank_mpi, nb_process); >

и делать в function_parallelize «

Параллельные процессы MPI


function_to_parallelize(data1, data2, data3, array_global, rank_mpi, nb_process) < int i; double *gathered_array_global; int size_block = size_loop/nb_process; for (i = rank_mpi*size_block; i < (rank_mpi+1)*size_block; i++) < compute(data1, data2, data3, i, array_global); >MPI_Gather(gathered_array_global, array_global, 0); // Gather all array_global into gathered_array_global for root process «rank_mpi = 0» if (rank_mpi = 0) < write(file4, gathered_array_global);>>

?? Я имею в виду, если я использую MPI_Gather в функции, могу ли я получить желаемый результат, то есть все array_global помещаются в окончательный массив, в который я хочу записать file4 «?

Я только знаю, что традиционно MPI_Gather используется в main () для сбора всех подмассивов. Если я нахожусь в рутине, я думаю, что процессы не могут синхронизировать себя с другими процессами и, следовательно, не могут общаться между ними, правильно?

Мой второй вопрос о стратегии принятия для этого распараллеливания: вы думаете, что все процессы могут читать « file1 «,» file2 без конфликтов между ними?

Для записи « data3 «Я думаю, что могу писать только для одного процесса ( rank_mpi = 0 ), иначе будут ошибки при исполнении

Спасибо за вашу помощь и советы

Решение

Ваш псевдокод будет работать, если написан в правильном синтаксисе. Нет проблем с использованием вызовов MPI в функциях, отличных от main. НО я не думаю, что это будет делать то, что вы хотите. Использование вызовов MPI в вашем function_to_parallelize хорошо, но давайте посмотрим поближе,

function_to_parallelize(data1, data2, data3, array_global, rank_mpi, nb_process) < int i; double *gathered_array_global; int size_block = size_loop/nb_process; for (i = rank_mpi*size_block; i < (rank_mpi+1)*size_block; i++) < compute(data1, data2, data3, i, array_global); >MPI_Gather(gathered_array_global, array_global, 0); // Gather all array_global into gathered_array_global for root process «rank_mpi = 0″if (rank_mpi = 0) < write(file4, gathered_array_global);>>

Вы разбиваете проблему так, что только часть каждого array_global на каждом процессе будут вычислены. Например, предположим, у вас есть rank_mpi является 0-3 а также size_loop=40 чтобы size_block=10 , Это означает, что array_global[0-9] будет рассчитан на процесс 0, array_global[10-19] на процесс 1 и так далее. Затем, когда вы звоните MPI_Gather вам понадобится gathered_array_global быть размером nb_process * size_loop держать данные.

Лекция 2. Основные функции библиотеки MPI.

Я думаю, что вам нужно сделать меньший локальный массив, который бы просто соответствовал вычисляемым данным (другими словами, массив размером 10), а затем передать их в MPI_Gather для сбора в массив размером 40 (собрание_array_global). Конечно, вы также должны быть осторожны в случае, если размер массива не делится точно на количество процессов, которые вы используете.

Читайте также:
Условно бесплатные программы определение

Теоретически, одновременное чтение всех процессов из файлов — это нормально, но вы можете легко сломать практически любую файловую систему, запросив большое количество одновременных операций чтения. Я бы использовал трансляцию, но это зависит от вашей конкретной ситуации.

Наконец, если вы не используете библиотеку параллельного вывода, вы не можете иметь более одного процесса записи в файл одновременно. Независимо от того, какую файловую систему вы используете, она может сломать все. Лучше всего делать то, что вы думали и собираться, а затем написать из одного процесса.

Источник: web-answers.ru

Настройка OpenMP в CLion и пример программы

Доброго времени суток! Продолжаем рассматривать варианты параллельного исполнения программ. Я уже рассказывал про библиотеку MPI, которая позволяет создавать несколько параллельно исполняемых процессов в системе. Рассказал о базовой установке MPI, интеграции его в CLion и даже поделился своей реализацией алгоритма Флойда-Уоршелла.

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

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

Что такое OpenMP

Признанным открытым стандартном параллельного программирования на языках C/C++ и Fortran является OpenMP. Он включает в себя множество директив препроцессора, библиотечных функций и переменных окружения для реализации многопоточных программ. Более подробную информацию вы сможете найти на вики и прочих источниках, а я перейду непосредственно к настройке.

Настройка OpenMP в CLion

По аналогии с настройкой MPI, дело решается всего одной строкой в CMakeLists.txt . Дело в том, что специально устанавливать OpenMP не нужно, он по умолчанию поддерживается очень многими компиляторами, в том числе и gcc версии 4.7 и выше. На моей Ubuntu 16.04 из коробки установлен gcc версии 5.4.0, поэтому никакой головной боли я не испытал. Поэтому смело обновляйте gcc и в бой. Гордым обладателям Visual Studio стоит покопаться в настройках проекта и включить поддержку OpenMP.

Дать компилятору понять, что нужно работать с потоками можно флагом -fopenmp. Именно это мы и пропишем в CMakeLists.txt

set(CMAKE_CXX_FLAGS «$ -std=c++11 -fopenmp»)

1.2 Стандарты для распараллеливания программ

В качестве средства для написания параллельных программ для многопроцессорных систем чаще всего используют 2 стандарта:

OpenMP (Open specifications for Multi–Processing) — стандарт для написания параллельных программ в условиях общей памяти. Программа представляется как набор потоков объединённых общей памятью, где проблема синхронизации решается введением критических секций и приватных переменных;

MPI (Message Passing Interface) — стандарт, предназначенный для написания программ в условиях разделённой памяти, данный стандарт описывает параллельную программу как набор нитей, взаимодействующих посредством передачи сообщений.

OpenMP. Стандарт OpenMP был разработан в 1997 году, как API, ориентированный на написание портируемых многопоточных приложений. Сначала он был основан на языке Fortran, но позднее включил в себя и C/C++.

Читайте также:
Прикладная компьютерная программа это 10 букв

Разработкой стандарта занимается организация OpenMP ARB (ARchitecture Board), в которую вошли представители крупнейших компаний – разработчиков SMP-архитектур и программного обеспечения. Спецификации для языков Fortran и C/C++ появились соответственно в октябре 1997 года и октябре 1998 года. OpenMP задуман как стандарт для программирования на масштабируемых SMP-системах (SSMP, ccNUMA) в модели общей памяти (shared memory model).

OpenMP – это набор специальных директив компилятору, библиотечных функций и переменных окружения. Наиболее оригинальны директивы компилятору, которые используются для обозначения областей в коде с возможностью параллельного выполнения. Компилятор, поддерживающий OpenMP, преобразует исходный код и вставляет соответствующие вызовы функций для параллельного выполнения этих областей кода.

За счет идеи “частичного распараллеливания” OpenMP идеально подходит для разработчиков, желающих быстро распараллелить свои вычислительные программы с большими параллельными циклами. Разработчик не создает новую параллельную программу, а просто добавляет в текст последовательной программы OpenMP директивы. Предполагается, что OpenMP-программа на однопроцессорной платформе может быть использована в качестве последовательной программы, т.е. нет необходимости одновременно поддерживать последовательную и параллельную версии. Директивы OpenMP просто игнорируются последовательным компилятором, а для вызова процедур OpenMP могут быть подставлены заглушки (stubs), текст которых приведен в спецификациях.

OpenMP прост в использовании и включает лишь два базовых типа конструкций: директивы pragma и функции исполняющей среды OpenMP. Директивы pragma, как правило, указывают компилятору, как реализовать параллельное выполнение блоков кода. Все эти директивы начинаются с фразы pragma omp.

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

Функции OpenMP служат в основном для изменения и получения параметров окружения. Кроме того, OpenMP включает API-функции для поддержки некоторых типов синхронизации. Чтобы задействовать эти функции OpenMP библиотеки периода выполнения (исполняющей среды), в программу нужно включить заголовочный файл omp.h. Если же используется в приложении только OpenMP-директивы pragma, включать этот файл не требуется.

MPI. Стандарт MPI используется в системах с распределенной памятью. Он возник в 1994 году как решение проблемы разнообразия архитектур параллельных вычислительных систем и обеспечение возможности создания мобильных (переносимых между различными компьютерными платформами) программ. Наличие такого стандарта позволило разработать стандартные библиотеки программ (MPI-библиотеки), в которых оказалось возможным скрыть большинство архитектурных особенностей параллельных вычислительных систем и, как результат, существенно упростить проблему создания параллельных программ. Более того, стандартизация базового системного уровня позволила в значительной степени обеспечить мобильность параллельных программ, поскольку в настоящее время реализации MPI-стандарта имеются для большинства компьютерных платформ.

Основной целью спецификации MPI явилось сочетание в рамках единого подхода мобильных, эффективных и развитых средств передачи данных. Это означает возможность писать мобильные программы, использующие специализированное аппаратное или программное обеспечение, предлагаемое отдельными поставщиками. В то же время многие свойства, такие как ориентированная на приложения структура процессов или динамически управляемые группы процессов с широким набором коллективных операций, которые есть в любой реализации MPI, могут быть использованы в любой параллельной прикладной программе [1].

Формально MPI-подход основан на включении в программные модули вызовов функций специальной библиотеки (заголовочные и библиотечные файлы для языков С/С++ и Fortran) и загрузчика параллельно исполняемого кода в вычислительные узлы (ВУ). Подобные библиотеки имеются практически для всех платформ, поэтому написанные с использованием технологии MPI взаимодействия ветвей параллельного приложения программы независимы от машинной архитектуры (могут исполняться на однопроцессорных и многопроцессорных c общей или разделяемой памятью ЭВМ), от расположения ветвей (выполнение на одном или разных процессорах) и от API (Application Program Interface) конкретной операционной системы (ОС).

Читайте также:
Как написать бесконечность в программе

MPI является (довольно) низкоуровневым инструментом программиста; c помощью MPI созданы рассчитанные на численные методы специализированные библиотеки (например, включающая решение систем линейных уравнений, обращение матриц, ортогональные преобразования, поиск собственных значений и т.п. библиотеки ScaLAPACK и AZTEC для плотнозаполненных и разреженных матриц соответственно). MPI не обеспечивает механизмов задания начального размещения процессов по вычислительным узлам (процессорам); это должен явно задать программист или воспользоваться неким сторонним механизмом.

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

Каждый процесс параллельной программы порождается на основе копии одного и того же программного кода (модель SPMP — Single Programm Multiple Processes). Данный программный код, представленный в виде исполняемой программы, должен быть доступен в момент запуска параллельной программы на всех используемых процессорах. Исходный программный код для исполняемой программы разрабатывается на алгоритмических языках C или Fortran с использованием той или иной реализации библиотеки MPI.

Парадигма программирования определяется архитектурой вычислительной системы. OpenMP является классическим инструментом для программирования на системах с общей памятью. Технология MPI является основным средством программирования для кластерных систем и систем с распределенной памятью.

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

Использование библиотек позволяет достаточно быстро создавать сложные параллельные приложения. В последних трех главах рассмотрены основные свободно распространяемые математические пакеты Нypre, Trilinos, Petsc для организации параллельных вычислений на кластерах.

Hypre – библиотека высокопроизводительных предобуславливателей и решателей для больших разреженных линейных систем. Акцент делается на современные масштабируемые предобуславливатели. Разрабатывается в Ливерморской национальной лаборатории (Lawrence Livermore National Laboratory)

Trilinos – проект, направленный на развитие параллельных алгоритмов и библиотек в рамках объектно — ориентированного подхода. Данный пакет предназначен для применения к задачам науки и прикладного моделирования, требующие решения сложных и крупномасштабных задач математической физики. Разрабатывается в Сандийской национальной лаборатории (Sandia National Laboratories).

PETSc – библиотека, состоящая из процедур и структур данных для параллельного решения научных задач с моделями, описываемыми в виде дифференциальных уравнений с частными производными. Библиотека основана на использовании MPI, BLAS и LAPACK [2].

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru