Установка 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».
#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, мы ее установили и попробовали с ее помощью одновременно 5 раз поздороваться с миром. В следующем выпуске будут новые возможности MPI, а на сегодня у меня все, спасибо за внимание!
mpi install, running in Ubuntu 9
ссылаюсь на документ по адресу
http://cluster.linux-ekb.info/mpi1.php
скачал mpich 1.2.7.
начал устанавливать :
команда
./configure -with-arch=LINUX -with-device=ch_p4 -rsh=/usr/bin/ssh \--prefix=/usr/local/mpich-1.2.6/ch_p4
нормальна прошла вроде.
потом make прошла без вопросов.
однако make install сразу выводит error
не подскажете ли в чем проблема ?
nizamovich
22.11.09 00:23:17 MSK

список выведенный error в студию!
trex6 ★★★★★
( 22.11.09 00:44:01 MSK )

Прав, наверное, не хватает
kss ★★★★★
( 22.11.09 00:46:52 MSK )

aptitude install openmpi, не?
devl547 ★★★★★
( 22.11.09 00:51:32 MSK )
Для установки библиотеки MPI Chameleon, соответствующей стандарту MPI2, в Ubuntu вовсе не нужно собирать ее из исходников, как написано по указанной ссылке - так ты только захламишь систему. Для тебя уже всё собрано и лежит в репозиториях. Для установки выполняешь простую команду:
sudo apt-get install libmpich2-1.2 libmpich2-dev mpich2 mpich2-doc
и радуешься жизни. Для коммуникаций между узлами будет использоваться ssh. Тебе остается лишь настроить беспарольный доступ к узлам кластера. И всё.
twosev ★★
( 22.11.09 07:35:34 MSK )
Ответ на: комментарий от trex6 22.11.09 00:44:01 MSK
nizamovich@nizamovich-laptop:~/mpich_inst$ make install
if [ «/usr/local/mpich-1.2.7/ch_p4» = «/usr/local/mpich-1.2.7/ch_p4» ] ; then \
./bin/mpiinstall ; \
else \
./bin/mpiinstall -prefix=/usr/local/mpich-1.2.7/ch_p4 ; \
fi
mkdir: cannot create directory `/usr/local/mpich-1.2.7': Permission denied
**Error making directory /usr/local/mpich-1.2.7/ch_p4**
make: *** [install] Error 1
nizamovich@nizamovich-laptop:~/mpich_inst$
nizamovich
( 22.11.09 08:56:39 MSK ) автор топика
Ответ на: комментарий от twosev 22.11.09 07:35:34 MSK
nizamovich@nizamovich-laptop:~$ sudo apt-get install libmpich2-1.2 libmpich2-dev mpich2 mpich2-doc
[sudo] password for nizamovich:
Чтение списков пакетов. Готово
Построение дерева зависимостей
Чтение информации о состоянии. Готово
E: Не удалось найти пакет libmpich2-1.2
nizamovich
( 22.11.09 08:59:35 MSK ) автор топика
Ответ на: комментарий от nizamovich 22.11.09 08:59:35 MSK
Подключи репозиторий universe и почитай какую-нибудь современную книжку по linux.
dn2010 ★★★★★
( 22.11.09 09:24:43 MSK )
Ответ на: комментарий от nizamovich 22.11.09 08:59:35 MSK
Как уже любезно заметил dn2010, указанные пакеты лежат в репозитории universe.
twosev ★★
( 22.11.09 09:38:59 MSK )
Если ставить из исходников, то для make install нужны права суперпользователя (для записи в подкаталоги в /usr/local).
oami ★★
( 22.11.09 22:31:43 MSK )
Ответ на: комментарий от oami 22.11.09 22:31:43 MSK
прошу прощения, однако я в танке.
[quote]
Как уже любезно заметил dn2010, указанные пакеты лежат в репозитории universe.
[/quote]
этот репозиторий получается на внешке же ?
как подключить , если я сижу через прокси ?
оптимальным было бы скачать самому и поставить
прошло все прекрасно , вроде
в результате make install получил
installed MPICH in /usr/local/mpich-1.2.6/ch_p4
/usr/local/mpich-1.2.6/ch_p4/sbin/mpiuninstall may be used to remove the installation.
в /usr/local мпич нормально появился, однако
nizamovich@nizamovich-desktop:~/example$ mpirun -np 3 hello
Приложение 'mpirun' может быть найдено в следующих пакетах:
* lam-runtime
* mpich-bin
* mpich-mpd-bin
* mpich-shmem-bin
* mpich2-mpd
* openmpi-bin
Попробуйте: sudo apt-get install
mpirun: command not found
nizamovich@nizamovich-desktop:~/example$ sudo apt-get install mpich2-mpd
[sudo] password for nizamovich:
Чтение списков пакетов. Готово
Построение дерева зависимостей
Чтение информации о состоянии. Готово
E: Не удалось найти пакет mpich2-mpd
nizamovich@nizamovich-desktop:~/example$ sudo apt-get install mpich-mpd-bin
Чтение списков пакетов. Готово
Построение дерева зависимостей
Чтение информации о состоянии. Готово
E: Не удалось найти пакет mpich-mpd-bin
nizamovich@nizamovich-desktop:~/example$ sudo apt-get install mpich-bin
Чтение списков пакетов. Готово
Построение дерева зависимостей
Чтение информации о состоянии. Готово
E: Не удалось найти пакет mpich-bin
nizamovich@nizamovich-desktop:~/example$ mpicc hello.c -o 1
Приложение 'mpicc' может быть найдено в следующих пакетах:
* lam4-dev
* libmpich-mpd1.0-dev
* libmpich-shmem1.0-dev
* libmpich1.0-dev
* libopenmpi-dev
* mpich2
Попробуйте: sudo apt-get install
mpicc: command not found
nizamovich@nizamovich-desktop:~/example$
Может кто нить скачает попробует поставить ))) ? кому не лень.
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(); >
MPICH installation
I searching on internet how to download the MPICH in my laptop, and something is going wrong. I don't know what is happening. I am using ubuntu 18.04. Someone know any good installation video, or doc to use and download it? I am trying to do the installation since 3 days and I can't. Sorry for the silly question
asked May 7, 2020 at 11:24
Giorgos Mouch Giorgos Mouch
101 1 1 gold badge 1 1 silver badge 4 4 bronze badges
Are you sure you can't use the version that is provided by the Ubuntu repository?
May 7, 2020 at 11:42
if I write '''mpiexec --version''' tells me: mpiexec(OpenRTE) 2.1.1. But when I try to run a basic program like hello world, nothing happend.
May 7, 2020 at 11:46
1 Answer 1
1. Install mpich from the default Ubuntu repositories.
sudo apt install mpich
2. Copy the below hello world C code into a new file named mpi_hello_world.c and save.
#include #include int main(int argc, char** argv) < // Initialize the MPI environment MPI_Init(NULL, NULL); // Get the number of processes int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); // Get the rank of the process int world_rank; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); // Get the name of the processor char processor_name[MPI_MAX_PROCESSOR_NAME]; int name_len; MPI_Get_processor_name(processor_name, &name_len); // Print off a hello world message printf("Hello world from processor %s, rank %d out of %d processors\n", processor_name, world_rank, world_size); // Finalize the MPI environment. MPI_Finalize(); >
3. Change directories to the directory which contains mpi_hello_world.c, then compile and run the code with the following commands.
mpicc mpi_hello_world.c -o hello-world mpirun -np 5 ./hello-world
answered May 12, 2020 at 6:10
113k 108 108 gold badges 276 276 silver badges 307 307 bronze badges
I get: [-ideapad-3-15iil05:562228] *** Process received signal *** [-ideapad-3-15iil05:562228] Signal: Segmentation fault (11) [-ideapad-3-15iil05:562228] Signal code: Address not mapped (1) [-ideapad-3-15iil05:562228] Failing at address: (nil) [-ideapad-3-15iil05:562228] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x42520)[0x7f73e562d520] [-ideapad-3-15iil05:562228] *** End of error message *** Segmentation fault (core dumped)