<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Message_Passing_Interface</id>
	<title>Message Passing Interface - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Message_Passing_Interface"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=Message_Passing_Interface&amp;action=history"/>
	<updated>2026-07-16T10:11:24Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=Message_Passing_Interface&amp;diff=28943&amp;oldid=prev</id>
		<title>imported&gt;Alex NB OT: унификация языковых шаблонов</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=Message_Passing_Interface&amp;diff=28943&amp;oldid=prev"/>
		<updated>2025-11-15T11:09:54Z</updated>

		<summary type="html">&lt;p&gt;унификация языковых шаблонов&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Ложное перенаправление|OpenMPI}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Message Passing Interface&amp;#039;&amp;#039;&amp;#039; (MPI, интерфейс передачи сообщений) — программный интерфейс ([[API]]) для передачи [[информация|информации]], который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу. Разработан [[Гроупп, Уильям|Уильямом Гроуппом]], {{нп1|Ласк, Эвин|Эвином Ласком|en|Ewing Lusk}} и другими.&lt;br /&gt;
&lt;br /&gt;
MPI является наиболее распространённым стандартом интерфейса обмена данными в&lt;br /&gt;
[[Параллельное программирование|параллельном программировании]], существуют его реализации для большого числа компьютерных платформ. Используется при разработке программ для [[Кластер (группа компьютеров)|кластеров]] и [[суперкомпьютер]]ов. Основным средством коммуникации между [[процесс (информатика)|процессами]] в MPI является передача сообщений друг другу.&lt;br /&gt;
&lt;br /&gt;
Стандартизацией MPI занимается [[MPI Forum]]. В стандарте MPI описан интерфейс передачи сообщений, который должен поддерживаться как на платформе, так и в [[Прикладное программное обеспечение|приложениях]] пользователя. В настоящее время существует большое количество бесплатных и коммерческих реализаций MPI. Существуют реализации для языков [[Фортран]] 77/90, [[Java]], [[Си (язык программирования)|Си]] и [[C++]].&lt;br /&gt;
&lt;br /&gt;
В первую очередь MPI ориентирован на системы с [[Массивно-параллельная архитектура|распределенной памятью]], то есть когда затраты на передачу данных велики, в то время как [[OpenMP]] ориентирован на системы с общей памятью (многоядерные с общим кэшем). Обе технологии могут использоваться совместно, чтобы оптимально использовать в кластере многоядерные системы.&lt;br /&gt;
&lt;br /&gt;
== Стандарты MPI ==&lt;br /&gt;
Первая версия MPI разрабатывалась в 1993—1994 году, и MPI 1 вышла в 1994.&lt;br /&gt;
&lt;br /&gt;
Большинство современных реализаций MPI поддерживают версию 1.1. Стандарт MPI версии 2.0 поддерживается большинством современных реализаций, однако некоторые функции могут быть реализованы не до конца.&lt;br /&gt;
&lt;br /&gt;
В MPI 1.1 (опубликован [[12 июня]] [[1995 год]]а, первая реализация появилась в 2002 году) поддерживаются следующие функции:&lt;br /&gt;
* передача и получение сообщений между отдельными процессами;&lt;br /&gt;
* коллективные взаимодействия процессов;&lt;br /&gt;
* взаимодействия в группах процессов;&lt;br /&gt;
* реализация [[топология|топологий]] процессов;&lt;br /&gt;
&lt;br /&gt;
В MPI 2.0 (опубликован [[18 июля]] [[1997 год]]а) дополнительно поддерживаются следующие функции:&lt;br /&gt;
* динамическое порождение процессов и управление процессами;&lt;br /&gt;
* односторонние коммуникации (Get/Put);&lt;br /&gt;
* параллельный ввод и вывод;&lt;br /&gt;
* расширенные коллективные операции (процессы могут выполнять коллективные операции не только внутри одного коммуникатора, но и в рамках нескольких коммуникаторов).&lt;br /&gt;
&lt;br /&gt;
Версия MPI 2.1 вышла в начале сентября 2008 года.&lt;br /&gt;
&lt;br /&gt;
Версия MPI 2.2 вышла 4 сентября 2009 года.&lt;br /&gt;
&lt;br /&gt;
Версия MPI 3.0 вышла 21 сентября 2012 года.&lt;br /&gt;
&lt;br /&gt;
== Функционирование интерфейса ==&lt;br /&gt;
Базовым механизмом связи между MPI процессами является передача и приём сообщений. Сообщение несёт в себе передаваемые данные и информацию, позволяющую принимающей стороне осуществлять их выборочный приём:&lt;br /&gt;
* отправитель — ранг (номер в группе) отправителя сообщения;&lt;br /&gt;
* получатель — ранг получателя;&lt;br /&gt;
* признак — может использоваться для разделения различных видов сообщений;&lt;br /&gt;
* коммуникатор — код группы процессов.&lt;br /&gt;
Операции приёма и передачи могут быть блокирующимися и неблокирующимися. Для неблокирующихся операций определены функции проверки готовности и ожидания выполнения операции.&lt;br /&gt;
&lt;br /&gt;
Другим способом связи является удалённый доступ к памяти (RMA), позволяющий читать и изменять область памяти удалённого процесса. Локальный процесс может переносить область памяти удалённого процесса (внутри указанного процессами окна) в свою память и обратно, а также комбинировать данные, передаваемые в удалённый процесс с имеющимися в его памяти данными (например, путём суммирования). Все операции удалённого доступа к памяти не блокирующиеся, однако, до и после их выполнения необходимо вызывать блокирующиеся функции синхронизации.&lt;br /&gt;
&lt;br /&gt;
== Пример программы ==&lt;br /&gt;
Ниже приведён пример программы вычисления числа &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; на языке &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039; с использованием &amp;#039;&amp;#039;&amp;#039;MPI&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// Подключение необходимых заголовков&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
// Подключение заголовочного файла MPI&lt;br /&gt;
#include &amp;quot;mpi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
// Функция для промежуточных вычислений&lt;br /&gt;
double f(double a)&lt;br /&gt;
{&lt;br /&gt;
    return (4.0 / (1.0+ a*a));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Главная функция программы&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    // Объявление переменных&lt;br /&gt;
    int done = 0, n, myid, numprocs, i;&lt;br /&gt;
    double PI25DT = 3.141592653589793238462643;&lt;br /&gt;
    double mypi, pi, h, sum, x;&lt;br /&gt;
    double startwtime = 0.0, endwtime;&lt;br /&gt;
    int namelen;&lt;br /&gt;
    char processor_name[MPI_MAX_PROCESSOR_NAME];&lt;br /&gt;
 &lt;br /&gt;
    // Инициализация подсистемы MPI&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    // Получить размер коммуникатора MPI_COMM_WORLD&lt;br /&gt;
    // (общее число процессов в рамках задачи)&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD,&amp;amp;numprocs);&lt;br /&gt;
    // Получить номер текущего процесса в рамках &lt;br /&gt;
    // коммуникатора MPI_COMM_WORLD&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD,&amp;amp;myid);&lt;br /&gt;
    MPI_Get_processor_name(processor_name,&amp;amp;namelen);&lt;br /&gt;
 &lt;br /&gt;
    // Вывод номера потока в общем пуле&lt;br /&gt;
    fprintf(stdout, &amp;quot;Process %d of %d is on %s\n&amp;quot;, myid,numprocs,processor_name);&lt;br /&gt;
    fflush(stdout);&lt;br /&gt;
 &lt;br /&gt;
    while(!done)&lt;br /&gt;
    {&lt;br /&gt;
        // количество интервалов&lt;br /&gt;
        if(myid==0)&lt;br /&gt;
        {&lt;br /&gt;
            fprintf(stdout, &amp;quot;Enter the number of intervals: (0 quits) &amp;quot;);&lt;br /&gt;
            fflush(stdout);&lt;br /&gt;
            if(scanf(&amp;quot;%d&amp;quot;,&amp;amp;n) != 1)&lt;br /&gt;
            {&lt;br /&gt;
                fprintf(stdout, &amp;quot;No number entered; quitting\n&amp;quot;);&lt;br /&gt;
                n = 0;&lt;br /&gt;
            }&lt;br /&gt;
            startwtime = MPI_Wtime();&lt;br /&gt;
        }&lt;br /&gt;
        // Рассылка количества интервалов всем процессам (в том числе и себе)&lt;br /&gt;
        MPI_Bcast(&amp;amp;n, 1, MPI_INT, 0, MPI_COMM_WORLD);&lt;br /&gt;
        if(n==0)&lt;br /&gt;
            done = 1;&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            h = 1.0 / (double) n;&lt;br /&gt;
            sum = 0.0;&lt;br /&gt;
            // Обсчитывание точки, закрепленной за процессом&lt;br /&gt;
            for(i = myid + 1 ; (i &amp;lt;= n) ; i += numprocs)&lt;br /&gt;
            {&lt;br /&gt;
                x = h * ((double)i - 0.5);&lt;br /&gt;
                sum += f(x);&lt;br /&gt;
            }&lt;br /&gt;
            mypi = h * sum;&lt;br /&gt;
 &lt;br /&gt;
            // Сброс результатов со всех процессов и сложение&lt;br /&gt;
            MPI_Reduce(&amp;amp;mypi, &amp;amp;pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);&lt;br /&gt;
 &lt;br /&gt;
            // Если это главный процесс, вывод полученного результата&lt;br /&gt;
            if(myid==0)&lt;br /&gt;
            {&lt;br /&gt;
                printf(&amp;quot;PI is approximately %.16lf, Error is %.16lf\n&amp;quot;, pi, fabs(pi - PI25DT));&lt;br /&gt;
                endwtime = MPI_Wtime();&lt;br /&gt;
                printf(&amp;quot;wall clock time =%lf\n&amp;quot;, endwtime-startwtime);&lt;br /&gt;
                fflush(stdout);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // Освобождение подсистемы MPI&lt;br /&gt;
    MPI_Finalize();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализации MPI ==&lt;br /&gt;
* [[MPICH]] — одна из самых первых свободная реализация MPI, работает на [[UNIX]]-системах и [[Windows NT]]&lt;br /&gt;
* [https://www.open-mpi.org/ Open MPI] — ещё одна свободная реализация MPI. Основана на более ранних проектах FT-MPI, LA-MPI, LAM/MPI и PACX-MPI. Поддерживаются различные коммуникационные системы (в том числе [[Myrinet]]).&lt;br /&gt;
*&lt;br /&gt;
* [https://web.archive.org/web/20070527192726/http://www.mpi-softtech.com/mpi_pro.php MPI/PRO] for Windows NT — коммерческая реализация для [[Windows NT]]&lt;br /&gt;
* [http://software.intel.com/en-us/intel-mpi-library/ Intel MPI] — коммерческая реализация для [[Windows]] / [[Linux]]&lt;br /&gt;
* Microsoft MPI входит в состав [[Compute Cluster Pack SDK]]. Основан на MPICH2, но включает дополнительные средства управления заданиями. Поддерживается спецификация MPI-2.&lt;br /&gt;
* [https://web.archive.org/web/20060809212300/http://h21007.www2.hp.com/dspp/tech/tech_TechDocumentDetailPage_IDX/1,1701,1238,00.html HP-MPI] — коммерческая реализация от [[Hewlett-Packard|HP]]&lt;br /&gt;
* [[SGI]] [http://www.sgi.com/products/software/mpt/ MPT] — платная библиотека MPI от [[SGI]]&lt;br /&gt;
* [http://mvapich.cse.ohio-state.edu/ Mvapich] — свободная реализация MPI для [[Infiniband]]&lt;br /&gt;
* [http://www.sun.com/software/products/clustertools/index.xml Oracle HPC ClusterTools] — бесплатная реализация для [[Solaris]] [[SPARC]]/[[x86]] и [[Linux]] на основе Open MPI&lt;br /&gt;
* [[MPJ]] — MPI for Java&lt;br /&gt;
* [http://www.mpj-express.org/ MPJ Express] — MPI на Java&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Исчисление взаимодействующих систем]]&lt;br /&gt;
* [[Charm++]]&lt;br /&gt;
* [[Global Arrays]]&lt;br /&gt;
* [[X10 (язык программирования)]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://www.mpi-forum.org/ MPI Forum] {{ref|en}}&lt;br /&gt;
* [http://www-unix.mcs.anl.gov/mpi/mpich/ MPICH] {{ref|en}}&lt;br /&gt;
* [http://parallel.ru/tech/tech_dev/mpi.html MPI на parallel.ru] {{ref|ru}}&lt;br /&gt;
* [http://www.ccas.ru/mmes/educat/lab04k/01/basics.html MPI в Вычислительном центре им. А. А. Дородницына РАН] {{ref|ru}} &lt;br /&gt;
* [http://www.mpj-express.org/ MPJ Express (Java)] {{ref|en}}&lt;br /&gt;
* [http://www.hpjava.org/papers/MPJ-CPE/cpempi/cpempi.html MPJ: MPI for Java] {{ref|en}}&lt;br /&gt;
* [http://www.ccas.ru/mmes/educat/lab04k/ Курс лабораторных работ по MPI] (рус. koi8-R)&lt;br /&gt;
* &amp;#039;&amp;#039;Оленёв Н.Н.&amp;#039;&amp;#039; [http://www.ccas.ru/olenev/MPIbook1.pdf Основы параллельного программирования в системе MPI]. М.: [[ВЦ РАН]], 2005. 80 с. Web:  {{ref|ru}}&lt;br /&gt;
* &amp;#039;&amp;#039;Долматова А.И., Оленёв Н.Н.&amp;#039;&amp;#039; [http://www.ccas.ru/olenev/Dolmatova_OlenevPDF1.pdf Параллельные вычисления в моделировании региональной экономики]: учебное пособие / &amp;#039;&amp;#039;А.И. Долматова, Н.Н. Оленёв&amp;#039;&amp;#039;. – Киров: ПРИП ФГБОУ ВПО «ВятГУ», 2012. – 125 с. Web:  {{ref|ru}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Portable Extensible Toolkit for Scientific Computation|PETSc]] — библиотека параллельных программ для решения систем линейных алгебраических уравнений&lt;br /&gt;
* [[OpenMP]] ({{lang-en|Open Multi-Processing}}) — технология мультипроцессорного (мультипотокового) программирования.&lt;br /&gt;
* [[Модель акторов]]&lt;br /&gt;
* [[mpC]] — [http://panda.ispras.ru/~mpc/index.html The mpC Parallel Programming Environment]{{ref|en}}&lt;br /&gt;
&lt;br /&gt;
{{ПО для распределенных вычислений}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Параллельные вычисления]]&lt;br /&gt;
[[Категория:Кластерные системы]]&lt;br /&gt;
[[Категория:Библиотеки параллельного программирования]]&lt;br /&gt;
[[Категория:Сетевое программное обеспечение]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Alex NB OT</name></author>
	</entry>
</feed>