Mpi на linux h

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

* 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

#include #include int main(int argc,char **argv) < int rank,size; char A[3][50]=; char B[50]=<>,C[50]=<>,D[50]=<>; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank==0) < printf("Rank %d started \n",rank); MPI_Recv(B,50,MPI_CHAR,1,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); printf("Rank %d recieve %s message \n",1,B); MPI_Recv(C,50,MPI_CHAR,2,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); printf("Rank %d recieve %s message \n",2,C); MPI_Recv(D,50,MPI_CHAR,3,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); printf("Rank %d recieve %s message \n",3,D); >else < printf("Rank %d sends %s message \n",rank,A[rank-1]); MPI_Send(A[rank-1],20,MPI_CHAR,0,0,MPI_COMM_WORLD); >MPI_Finalize(); > 

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

#include #include #include #include int main(int argc,char **argv) < int rank,size,i; double x=0,y=0,pi,z; int no = atoi(argv[1]); int count=0,total_count=0,no_div=0,fin_no = 0; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); no_div = no/size; srand ( time(NULL) ); for(i=0;iprintf("For rank %d count = %d itrr = %d\n",rank,count,no_div); MPI_Reduce(&count,&total_count,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD); MPI_Reduce(&no_div,&fin_no,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD); if(rank ==0) < printf("Total count = %d, total itrr = %d\n",total_count,fin_no); pi = ((double)total_count)/fin_no*4.0000; printf("Pi value = %lf",pi); >MPI_Finalize(); > 

3. MPI Program to find sum of 2 large array

#include #include #include void allocate(int a[],int n) < int i; for(i=0;iint main(int argc, char**argv) < int rank,size,n,count,*a=NULL,*b=NULL,*c=NULL,*d=NULL,*e=NULL,*f=NULL,i; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); n=atoi(argv[1]); printf("Rank =%d n= %d",rank,n); count=n/size; d=(int*)malloc(count*sizeof(int)); e=(int*)malloc(count*sizeof(int)); f=(int*)malloc(count*sizeof(int)); if(rank ==0) < a=(int*)malloc(n*sizeof(int)); b=(int*)malloc(n*sizeof(int)); c=(int*)malloc(n*sizeof(int)); allocate(a,n); allocate(b,n); >MPI_Scatter(a,count,MPI_INT,d,count,MPI_INT,0,MPI_COMM_WORLD); MPI_Scatter(b,count,MPI_INT,e,count,MPI_INT,0,MPI_COMM_WORLD); for(i=0;i MPI_Finalize(); > 

Источник

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

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

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

Кстати, в OpenSuse для установки MPI достаточно добавить соответствующий пакет в Yast. Приведенная ниже инструкция пригодится если в вашем дистрибутиве нет такого пакета или есть, но нужна другая версия. Проходим на официальный сайт, в раздел загрузки. Там нас интересует табличка с платформами и версиями библиотеки, находим Ubuntu и скачиваем. Попадаем на страницу Ubuntu packages и выбираем свою платформу. Мы попадаем на страницу с выбором зеркала для скачивания. … И вот у нас на диске deb пакет библиотеки, который мы устанавливаем двойным кликом. После установки в системе появились компиляторы для языков C/C++ и Fortran, которые называются соответственно mpicc/mpic++ и mpifortran. Каждый из них снабжен подробной документацией, что резко уменьшает продолжительность танцев с бубном. Рассмотрим компиляцию и запуск на классическом примере — программа «Hello, world».

#include //Не забываем подключить библиотеку к проекту #include "/usr/include/mpich/mpi.h" using namespace std; int main(int argc, char **argv) < //Инициализируем mpi MPI_Init(&argc, &argv); cout 

Компилируется это дело командой 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++") . Буквально только, после очередной переустановки системы, мной было замечено, что библиотека корректно подключилась только с настройкой cmake_minimum_required(VERSION 3.6) Будьте внимательны.

Источник

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

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

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

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

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

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

Скачивание библиотеки mpich

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

Выбор архитектуры при загрузке библиотеки mpich

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

Выбор зеркала для скачивания библиотеки mpich

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

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

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

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

#include //Не забываем подключить библиотеку к проекту #include "/usr/include/mpich/mpi.h" using namespace std; int main(int argc, char **argv) < //Инициализируем mpi MPI_Init(&argc, &argv); cout 

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

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

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

Заключение

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

Источник

Разворачиваем MPI кластер на Linux

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

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

Существует много различных вариантов создания кластеров под Linux. Мы будем использовать MPI (Message Passing Interface) для обеспечения взаимодействия между узлами нашего кластера.

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

Перед началом создания собственного двухузлового кластера нам потребуются два сервера с установленной ОС Ubuntu 22.04. Между этими узлами нам необходимо установить прямое соединение для обмена heartbeat. Каждому из этих сетевых интерфейсов необходимо назначить статический IP адрес. У нас это будут 10.0.0.1 (node_1) и 10.0.0.2 (node_2).

Далее я буду предполагать, что у вас уже установлен SSH сервер. Если это по какой-то причине не так, то установите SSH на оба узла с помощью команды:

sudo apt install openssh-server

Первое, что нам потребуется сделать это настроить беспарольный доступ по SSH с помощью сертификатов. Выполним следующую команду:

sudo ssh-keygen -t rsa -b 4096

После ее запуска вам будут заданы несколько вопросов, на которые можно ответить предлагаемыми значениями по умолчанию. В результате будут созданы два файла ~/.ssh: id_rsa и id_rsa.pub. Последний является открытым ключом. Содержимое этого файла необходимо скопировать в файл ~/.ssh/authorized-keys на удаленном компьютере. Это можно сделать к примеру с помощью утилиты scp.

scp ~/.ssh/authorized_keys 10.0.0.2:~/.ssh/

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

Устанавливаем протокол коммуникаций

Далее для работы нашего кластера нам потребуется установить средство для обмена сообщениями. Мы будем использовать MPI (Message Passing Interface) – стандартный коммуникационный протокол для распределенных вычислений. Не вдаваясь в технические особенности и версии данного протокола установим на обоих узлах одну из реализаций MPI с помощью команды:

sudo apt install libopenmpi-dev

После этого нам необходимо проверить возможность выполнять команды на удаленном узле. Для этого выполним следующее на узле 10.0.0.1:

mpirun -np 2 -host 10.0.0.2:2 hostname

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

Для удобства работы с узлами кластера рекомендуется прописать в файле /etc/hosts соответствие IP адресов каждого из узлов и их имен:

10.0.0.2 node_2 10.0.0.1 node_1

Есть причина, по которой мы до сих пор использовали команду hostname: она доступна по умолчанию во всех системах. При использовании MPI важно помнить, что мы, по сути, используем сетевое подключение только для того, чтобы позволить нескольким запущенным заданиям взаимодействовать друг с другом. Однако каждое задание выполняется на своем собственном компьютере, имеющем доступ к своему собственному жесткому диску. Это, в частности, означает, что команда для запуска должна существовать на всех компьютерах и в одном и том же расположении.

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

Для установки ее компонентов на узле node_1 выполним следующую команду:

sudo apt install nfs-kernel-server nfs-common

Далее вам нужно создать точку монтирования для общего каталога. Будем расшаривать домашний каталог пользователя user на node_1.

Далее на том же node_1 добавим в файл /etc/exports строку для доступа со второй ноды:

На узле node_2 создадим каталог /nfs

И добавим в fstab следующую запись:

. 10.0.0.1:/home/user /nfs nfs defaults 0 0

Далее выполним монтирование:

Если монтирование завершилось успешно, то мы можем перейти в папку nfs и увидеть содержимое, реально находящееся на node_1.

drwxr-xr-x 80 user user 12288 Sep 7 14:17 .

drwxr-xr-x 25 root root 4096 Aug 27 06:19 ..

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

Заключение

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

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

Источник

Читайте также:  Двухпанельный файловый менеджер linux
Оцените статью
Adblock
detector