Mpi linux ��� ���

Установка MPI на Linux Ubuntu

Доброго времени суток! С этой самой заметки начнется погружение в параллельный мир параллельного программирования, с целью научиться распараллеливать все, что написано на C/C++ и даже на Fortran. Инструментом нам послужит классическая библиотека MPICH версии 3.0. Но прежде, что такое MPI.

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

Библиотека MPICH, которую мы будем устанавливать, является одной из самых первых MPI библиотек, поэтому я назвал ее классической. На ее основе в будущем было построено большое множество коммерческих и открытых библиотек, возможно, про некоторые из них я тоже когда нибудь напишу. Приступим к установке.

Установка библиотеки MPI

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

Попадаем на страницу Ubuntu packages и выбираем свою платформу. Я себе скачиваю amd64, вот из этого списка.

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

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

Запуск программ с использованием MPI

После установки в системе появились компиляторы для языков C/C++ и Fortran, которые называются соответственно mpicc/mpic++ и mpifortran. Каждый из них снабжен подробной документацией, что резко уменьшает продолжительность танцев с бубном.

Рассмотрим компиляцию и запуск на классическом примере — программа «Hello, world».

Компилируется это дело командой

mpic++ -o hello hello.cpp

И сразу запускаем с помощью mpiexec, параметр -n говорит о том, сколько процессов запустить для этой программы.

mpiexec -n 5 ./hello

Таким образом мы запустим 5 процессов.

Заключение

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

Источник

Установка MPI на Linux и настройка CLion

Про возможности параллельного программирования, которые предоставляет нам библиотеки MPI можно прочитать в специальной статье: Основы технологии MPI на примерах. Тут же мы рассмтрим как эту библиотеку установить…

Установка MPI в Linux

Кстати, в OpenSuse для установки MPI достаточно добавить соответствующий пакет в Yast. Приведенная ниже инструкция пригодится если в вашем дистрибутиве нет такого пакета или есть, но нужна другая версия.

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

Читайте также:  There are no tap windows adapters on this system что это

Попадаем на страницу Ubuntu packages и выбираем свою платформу. Мы попадаем на страницу с выбором зеркала для скачивания. … И вот у нас на диске deb пакет библиотеки, который мы устанавливаем двойным кликом.

После установки в системе появились компиляторы для языков C/C++ и Fortran, которые называются соответственно mpicc/mpic++ и mpifortran. Каждый из них снабжен подробной документацией, что резко уменьшает продолжительность танцев с бубном.

Рассмотрим компиляцию и запуск на классическом примере — программа «Hello, world».

Компилируется это дело командой

mpic++ -o hello hello.cpp

И сразу запускаем с помощью mpiexec, параметр -n говорит о том, сколько процессов запустить для этой программы.

mpiexec -n 5 ./hello

Таким образом мы запустим 5 процессов.

Подключение MPI в CLion

Проекты на C/C++ в CLion`е собираются с помощью автоматизированной кроссплатформенной системы сборки CMake. Суть в двух словах, мы пишем файл CMakeLists.txt в корне проекта, который содержит правила для сборки, на которые ориентируется Make, либо ее аналог в Windows. Более подробно о CMake написано в статье на хабре.

Подключать библиотеку мы будем именно с помощью настроек CMake.

Нам нужно добавить библиотеку mpi.h, сделать это можно с помощью правила include_directories() . В качестве аргумента передаем полный путь до библиотеки(в Linux Ubuntu — /usr/include/mpi/ ). Не забываем нажать «Reload changes» справа в углу.

Готово, теперь CLion знает все функции MPI, но пока не умеет их собирать.

Настройка компилятора прописывается в CMakeLists.txt правилами set() . Напомню, что в Ubuntu компиляторы живут по адресу /usr/bin/mpicc для си, и /usr/bin/mpic++ для си++ соответственно. Поэтому добавляем два правила: set(CMAKE_C_COMPILER «/usr/bin/mpicc») и set(CMAKE_CXX_COMPILER «/usr/bin/mpic++») .

Буквально только, после очередной переустановки системы, мной было замечено, что библиотека корректно подключилась только с настройкой

Источник

pajayrao / mpi installation on ubuntu with basic mpi programs.md

Installing and Basic Programs on MPI C

Installing MPI on Ubuntu

Run the following command on terminal

Compiling MPI Programs

Executing MPI Programs

Basic MPI Programs

Basic MPI Function

* MPI_Init(&argc,&argv) : Initialize MPI part of the program. Compulsory for all MPI programs .

* MPI_Comm_rank(MPI_COMM_WORLD,&rank) : Returns the rank (process id) of that processes.

* MPI_Comm_size(MPI_COMM_WORLD,&size) : Returns the total number of processes.

* MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag,MPI_Comm comm, MPI_Status *status) :Recieves data from specified rank.

* MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,MPI_Comm comm) : Sends data to the specified rank.

* MPI_Scatter(void *send_data,int send_count,MPI_Datatype send_datatype,void *recv_data,int recv_count,MPI_Datatype recv_datatype,int root,MPI_Comm communicator) : Scatters data from a specified rank accross all the processes.

* MPI_Gather(void *send_data,int send_count,MPI_Datatype send_datatype,void *recv_data,int recv_count,MPI_Datatype recv_datatype,int root, MPI_Comm communicator) : Gathers data from all process to the specified process.

* MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,MPI_Op op, int root, MPI_Comm comm) :Reduces the specified a array by a specific operation accross all processes.

1. MPI Program to send data from 3 process to the fourth process

2. MPI Program to calculate value of PI using Monte Carlo method

3. MPI Program to find sum of 2 large array

Источник

Часть 1. MPI — Введение и первая программа

Введение. Зачем все это?

В этом цикле статей речь пойдет о параллельном программировании.

Часть 1. MPI — Введение и первая программа.

Читайте также:  Windows для asus m5a97 pro

В бой. Введение

Довольно часто самые сложные алгоритмы требуют огромного количества вычислительных ресурсов в реальных задачах, когда программист пишет код в стандартном его понимании процедурного или Объектно Ориентированного Программирования(ООП), то для особо требовательных алгоритмических задач, которые работают с большим количеством данных и требуют минимизировать время выполнения задачи, необходимо производить оптимизацию.

В основном используют 2 типа оптимизации, либо их смесь: векторизация и распараллеливание
вычислений. Чем же они отличаются?

Вычисления производятся на процессоре, процессор пользуется специальными «хранилищами» данных называемыми регистрами. Регистры процессора напрямую подключены к логическим элементам и требуют гораздо меньшее время для выполнения операций над данными, чем данные из оперативной памяти, а тем более на жестком диске, так как для последних довольно большую часть времени занимает пересылка данных. Так же в процессорах существует область памяти называемая Кэшем, в нем хранятся те значения, которые в данный момент участвуют в вычислениях или будут участвовать в них в ближайшее время, то есть самые важные данные.

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

Так а чем отличаются векторизация и параллельные вычисления? Векторизация — позволяет выполнять операции над данными целыми векторами. Например для С++: если мы используем AVX инструкции, то у нас есть вектора размером 256 бит, куда мы можем поместить float32 элементы. Получится, что мы можем собрать 2 вектора по (256 / 32) = 8 float32 значений. После чего выполнить над ними одну операцию за такт, хотя если бы мы этого не сделали, то вполне возможно, что аналогичные вычисления прошли бы за 8 операций, а то и больше если брать в учет вычисления индексов конкретных элементов. Однако есть одна проблема: компиляторы нынче довольно умны и довольно хорошо справляются с подобной оптимизацией и сами, поэтому большая часть сил уходит на то чтобы правильно организовать данные.

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

Основная часть

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

Существует два основных стиля создания параллельных программ: MIMD(Multiple Instruction Multiple Data — Множественный поток Инструкций, Множественный поток Данных) и SPMD(Single Program Multiple Data — Одна Программа, Множественный поток Данных).

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

Установка

Поскольку MPI — библиотека, то необходимо ее прилинковать к компилятору. В каждой среде это делается по своему и в зависимости от компилятора. Лично я работал на Ubuntu Budgie 20.04 LTS и расскажу инструкцию по установке именно для нее.

Читайте также:  Linux переименовать несколько файлов по шаблону

В командной строке вводим следующие команды:

Первая команда обновляет менеджер пакетов, вторая устанавливает компилятор GCC, если его нет в системе, третья программа устанавливает компилятор через который мы собственно и будем работать с C\С++&MPI кодом.

Первые шаги.

MPI-программа — это множество параллельных взаимодействующих процессов, которые работают каждый в своей выделенной области памяти. По сути это N независимых программ, которые общаются между собой в ходе работы. В MPI большинство типов данных уже переопределены и начинаются с аббревиатуры MPI_[Name], далее это будет понятно.

Для понимания того что происходит дальше нужно определиться с несколькими терминами:

Коммуникатор — объект через который общается определенная группа порожденных процессов. В С++/С это тип данных MPI_Comm. Коммуникатор может объединять несколько процессов путем передачи сообщений между ними, при этом коммуникаторов может быть несколько, группы которые они образуют могут как не пересекаться, так пересекаться частично. При старте программы все процессы работают под единым коммуникатором с именем MPI_COMM_WORLD. Кроме него существуют еще коммуникаторы MPI_COMM_SELF, MPI_COMM_NULL, которые содержат только текущий процесс и ни одного процесса соответственно.

Сообщение — набор данных некоторого типа, который передается при коммуникации процессов. Каждое сообщение имеет несколько атрибутов, в частности номер процесса-отправителя, получателя, идентификатор сообщения, коммуникатор и тег.

Тег сообщения — целое не отрицательное число от 0 до 32767(В зависимости от реализации. Максимально возможная величина тега хранится в константе MPI_TAG_UB).

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

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

Для того чтобы проверить работу программы реализуем самую примитивную программку на С++ с применением MPI.

Чтобы запустить эту программу сохраним нашу запись в файле с любым названием и расширением *.cpp, после чего выполним следующие действия в консоли (В моем случае код лежит в файле main.cpp):

Первая команда скомпилирует нашу MPI-программу, а вторая команда позволяет ее запустить. Заметим, что мы передаем параметры -n 2 во второй строке, зачем это? Таким образом мы сообщаем исполнителю, что нужно запустить 2 параллельных процесса.

Программа просто напечатает несколько строк в зависимости от количества процессов которое вы укажете. Не стоит пугаться если строки «Before . » и «After . « будут отображаться не по одному разу, в зависимости от реализации MPI программа может работать параллельно и вне процедур Init-Finalize.

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

Источник

Оцените статью