Сурак
1.Процесс дегеніміз не? Ағындар дегеніміз не? Процесс пен ағын айырмашылығы. Программы MPI состоят из автономных процессов, выполняющих собственный код, написанный в стиле MIMD. Коды, выполняемые каждым процессом, не обязательно идентичны. Процессы взаимодействуют через вызовы коммуникационных примитивов MPI. Обычно каждый процесс выполняется в его собственном адресном пространстве, хотя возможны реализации MPI с разделяемой памятью. MPI не описывает модель исполнения для каждого процесса. Процесс может быть последовательным или многопоточным. В последнем случае необходимо обеспечить `` потоковую безопасность '' (`` thread-safe''). Желаемое взаимодействие MPI с потоками должно состоять в том, чтобы разрешить конкурирующим потокам выполнять вызовы MPI, и вызовы должны быть реентерабельными; блокирующие вызовы MPI должны блокировать только вызываемый поток, не препятствуя планированию другого потока. MPI не обеспечивает механизмы для начального распределения процессов по физическим процессорам. Ожидается, что эти механизмы для этапа загрузки или исполнения обеспечат поставщики. Такие механизмы позволят описывать начальное число требуемых процессов; код, который должен исполняться каждым начальным процессом; размещение процессов по процессорам. Однако, существующее определение MPI не обеспечивает динамического создания или удаления процессов во время исполнения программ (общее число процессов фиксировано), хотя такое расширение предусматривается. Наконец, процесс всегда идентифицируется согласно его относительному номеру в группе, т. е. последовательными целыми числами в диапазоне 0,..., groupsize-1.
2.Декарт топологиясы. Периодтық көршілерді қолдану. Обобщением линейной и матричной топологий на произвольное число измерений является декартова топология Для создания декартовой топологии (решетки) в MPI предназначена функция: int MPI_Cart_create(MPI_Comm oldcomm, int ndims, int *dims, int *periods, int reorder, MPI_Comm *cartcomm). С помощью этой функции можно создавать топологии с произвольным числом измерений, причем по каждому измерению в отдельности можно накладывать периодические граничные условия. Таким образом, для одномерной топологии мы можем получить или линейную структуру, или кольцо в зависимости от того, какие граничные условия будут наложены. Для двумерной топологии, соответственно, либо прямоугольник, либо цилиндр, либо тор. Здесь periods - массив длины ndims, определяет, является ли решетка периодической вдоль каждого измерения. int dims[2]={0,0}, periods[2]={1,0},coords[2], ndims=2, reorder=0; - далее вызов функции MPI_Cart_create(MPI_COMM_WORLD,ndims,dims,periods,reorder,&cartcomm) – мы получаем цилиндр. Если periods[2]={1,1} – тор.
3. 3 өлшемді Лаплас теңдеуін 2-өлшемді декомпозиция тәсілімен программалау.
MPI_Comm GridComm;
int size,rank,i;
int ix,iy,iz;
int x,y,z,X=10,Y=10,Z=10;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Status status;
y=Y/size+2;
double matrix[X][y][Z],vecUP[X][Z],vecDOWN[X][Z];
if(rank==0)
{ for(ix=1;ix<X-1;ix++)
{ for(iz=1;iz<Z-1;iz++)
{ matrix[ix][1][iz]=1;} }
for(ix=1;ix<X-1;ix++) {
for(iy=2;iy<y-1;iy++){
for(iz=1;iz<Z-1;iz++) {
matrix[ix][iy][iz]=0; } } } }
else {
for(ix=1;ix<X-1;ix++) {
for(iy=1;iy<y-1;iy++) {
for(iz=1;iz<Z-1;iz++) {
matrix[ix][iy][iz]=0;}} } }
for(int i=0;i<10;i++) {
if(rank<size-1) {
for(ix=0;ix<X;ix++){
for(iz=0;iz<Z;iz++) {
vecUP[ix][iz]=matrix[ix][y-2][iz];}} MPI_Send(vecUP,X*Z,MPI_FLOAT,rank+1,rank,MPI_COMM_WORLD); MPI_Recv(vecUP,X*Z,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status);
for(ix=0;ix<X;ix++) {
for(iz=0;iz<Z;iz++) {
matrix[ix][y-1][iz]=vecUP[ix][iz]; } } }
if(rank>0) {
MPI_Recv(vecDOWN,X*Z,MPI_FLOAT,rank-1,rank-1,MPI_COMM_WORLD,&status);
for(ix=0;ix<X;ix++) {
for(iz=0;iz<Z;iz++) {
matrix0[ix][0][iz]=vecDOWN[ix][iz];
vecDOWN[ix][iz]=matrix[ix][1][iz]; } }
MPI_Send(vecDOWN,X*Z,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD); }
for(iz=1;iz<Z-1;iz++) {
for(iy=1;iy<y-1;iy++) {
if(rank==0&&iy==1){continue;}
if(rank==size-1&&iy==y-2){break;}
for(ix=1;ix<X-1;ix++) {
matrix[ix][iy][iz]=matrix[ix+1][iy][iz]+matrix[ix-1][iy][iz]+matrix[ix][iy+1][iz];
matrix[ix][iy][iz]+=matrix[ix][iy-1][iz]+matrix[ix][iy][iz+1]+matrix[ix][iy][iz-1];
matrix[ix][iy][iz]/=6; } } } }
while(stop==0); MPI_Finalize(); return 0;}
Сурак
1. Флинна таксономиясы. МISD, МIMD архитектуралары. В литературе часто используется та или иная схема классификации компьютерных архитектур и одной из наиболее популярных является таксономия Флинна. В ее основу положено описание работы компьютера с потоком команд и потоком данных. По Флинну принято классифицировать все возможные архитектуры компьютеров на четыре категории:
SISD (Single Instruction Stream - Single Data Stream) – один поток команд и один поток данных;
SIMD (Single Instruction Stream –Multiple Data Stream) – один поток команд и множество потоков данных;
MISD (Multiple Instruction Stream –Single Data Stream) – множество потоков команд и один поток данных;
MIMD (Multiple Instruction Stream –Multiple Data Stream) – множество потоков команд и множество потоков данных
MISD компьютеры
Вычислительных машин такого класса практически нет и трудно привести пример их успешной реализации. Один из немногих – систолический массив процессоров, в котором процессоры находятся в узлах регулярной решетки, роль ребер которой играют межпроцессорные соединения. Все процессорные элементы управляются общим тактовым генератором. В каждом цикле работы каждый процессорный элемент получает данные от своих соседей, выполняет одну команду и передает результат соседям
MIMD компьютеры
Эта категория архитектур вычислительных машин наиболее богата, если иметь в виду примеры ее успешных реализаций. В нее попадают симметричные параллельные вычислительные системы, рабочие станции с несколькими процессорами, кластеры рабочих станций и т.д. Уже довольно давно появились компьютеры с несколькими независимыми процессорами, но вначале на таких компьютерах был реализован только параллелизм заданий, то есть на разных процессорах одновременно выполнялись разные и независимые программы.
2. MPI программасын компиляциялау, жинау және орындау.
Поскольку MPI является библиотекой, то при компиляции программы необходимо соответствующие библиотечные модули. Это можно сделать в командной строке или воспользоваться предусмотренными в большинстве систем командами или скриптами mpicc(для программ на языке СИ), mpic++(для программ на языке С++), и mpif77/mpif90(для программ на языке Фортран 77/90). Опция компилятора «-o name» позволяет задать имя name для получаемого выполнимого файла, по умолчанию выполнимый файл называется a.out, например: mpif77 –o program program.f
После получения выполнимого файла необходимо запустить его на требуемом количестве процессов. Для этого обычно предоставляется команда запуска MPI –приложения mpirun,mpiexec, например:
mpirun –np N <программа с аргументами>
mpiexec –np N <программа с аргументами>
где N-число процессов,которое должно быть не более разрешенного в данной системе числа процессов для одной задачи. После запуска одна и та же программа будет выполняться всеми запущенными процессами, результат выполнения в зависимости от системы будет выдаваться на терминал или записываться в файл предопределенным именем.
3. 2*sin(x) функциясының интегралын [0,1] аймақта параллельді есептеңіз.
double f(double x)
{return 2*sin(x);}
int main(int argc,char **argv)
{
int size,rank;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
float h=0.05,a=0,b=1,s=0.0;
for(int i=rank; a+h*(i+1)<b+h; i+=size)
{ s+=h*f(a+h*(i+1)); }
if(rank!=0)
{ MPI_Send(&s,1,MPI_FLOAT,0,1,MPI_COMM_WORLD); }
if(rank==0)
{ float r;
MPI_Recv(&r,1,MPI_FLOAT,1,1,MPI_COMM_WORLD,&status);
s+=r;
printf("s=%f\n ",s);
}
}
Сурак
1. Жарыс күйі. Синхронизация. Философтар есебі.
Состояние гонки — это ошибка, возникающая, когда результат программы зависит от того, какой из двух потоков первым достигнет определенного блока кода.
Необходимость синхронизации обуславливается тем обстоятельством, что не все возможные траектории совместно выполняемых потоков являются допустимыми.В самом общем виде, синхронизация может быть обеспечена при помощи задания необходимых логических условий, которые должны выполняться в соответствующих точках траекторий потоков. Строгость данного свойства может быть несколько снижена – так, набор синхронизирующих действий можно ограничить требованием обеспечения достижимости допустимых траекторий программы – такое поведение обычно именуется свойством живучести. Задача обедающих философов. Задача позволяет рассмотреть способы доступа нескольких потоков к нескольким разделяемых ресурсов. Исходная формулировка задачи, впервые предложенная Э. Дейкстрой, выглядит следующим образом. Представляется ситуация, в которой пять философов располагаются за круглым столом.Для приема пищи в центре стола большое блюдо с неограниченным количеством спагетти, и тарелки, по одной перед каждым философом. Предполагается, что поесть спагетти можно только с использованием двух вилок. Для этого на столе располагается ровно пять вилок – по одной между тарелками философов.Для того, чтобы приступить к еде, философ должен взять вилки слева и, наложить спагетти, поесть, а затем обязательно положить вилки на свои места для их повторного использования. В данной задаче философы представляют собой потоки, а вилки – общие разделяемые ресурсы. Можно применить некоторое регламентирующее правило порядка взятия вилок – например, философ сначала берет левую вилку, затем правую. Итак, получаемый в результате алгоритм деятельности каждого философа состоит в следующем: как только философ приступает к еде, он пытается взять левую вилку. Если она занята, философ ждет ее освобождения и в конце концов ее получает. Возможная реализация предложенной схемы может состоять в следующем.
// Семафоры доступа к вилкам
Semaphore fork[5] = { 1, 1, 1, 1, 1 };
// Поток -философ (для всех философов одинаковый)
Prilosopher(){ // i – номер философа
while (1) { P(fork[i]); // Доступ к левой вилке P(fork[(i+1)%5]); // Доступ к правой вилке <Питание>
// Освобождение вилок
V(fork[i]); V(fork[(i+1)%5])
<Размышление> } }
(выражение (i +1)%5 определяет номер правой вилки, % есть операция получения остатка от целого деления в алгоритмическом языке С).
2. Коллективті мәлімет алмасу функциялары. Редукция мысалдары. Набор коллективных операций включает: - Синхронизацию всех процессов с помощью барьеров (MPI_Barrier); - Коллективные коммуникационные операции, в число которых входят: рассылка информации от одного процесса всем остальным членам некоторой области связи (MPI_Bcast); сборка (gather) распределенного по процессам массива в один массив с сохранением его в адресном пространстве выделенного (root) процесса (MPI_Gather, PI_Gatherv); сборка (gather) распределенного массива в один массив с рассылкой его всем процессам некоторой области связи (MPI_Allgather, MPI_Allgatherv); разбиение массива и рассылка его фрагментов (scatter) всем процессам области связи (MPI_Scatter, MPI_Scatterv); совмещенная операция Scatter/Gather (All-to-All), каждый процесс делит данные из своего буфера передачи и разбрасывает фрагменты всем остальным процессам, одновременно собирая фрагменты, посланные другими процессами в свой буфер приема (MPI_Alltoall, MPI_Alltoallv). - Глобальные вычислительные операции (sum, min, max и др.) над данными, расположенными в адресных пространствах различных процессов: с сохранением результата в адресном пространстве одного процесса (MPI_Reduce); с рассылкой результата всем процессам (MPI_Allreduce); совмещенная операция Reduce/Scatter (MPI_Reduce_scatter); префиксная редукция (MPI_Scan
3. Параллельді векторларды скаляр көбейту программасын жазыңыз
int main(int argc,char **argv)
{ int size,rank,i,n=6;
float *a,*b;
a=new float[n]; b=new float[n];
for(i=0;i<n;i++) {
a[i]=i+1; b[i]=i+1; }
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
float f=0,s=0,s1=0;
int nachalo,konec,shag;
shag=n/(size-1);
if(rank!=size-1) {
nachalo=rank*shag;
konec=rank*shag+shag;
for(i=nachalo;i<konec;i++)
s=s+a[i]*b[i];
MPI_Send(&s,1,MPI_FLOAT,size-1,1,MPI_COMM_WORLD);}
if(rank==size-1){
for(i=0;i<size-1;i++){ MPI_Recv(&s,1,MPI_FLOAT,i,1,MPI_COMM_WORLD,&status);
f=f+s; }
printf("%f\n",f);} MPI_Finalize();}
Сурак
1. Қазіргі параллель архитектуралы компьютерлер. Аппараттық бөлімі. Основным параметром классификации параллельных компьютеров является наличие общей (SMP) или распределенной памяти (MPP). Нечто среднее между SMP и MPP представляют собой NUMA-архитектуры, где память физически распределена, но логически общедоступна. Кластерные системы являются более дешевым вариантом MPP. При поддержке команд обработки векторных данных говорят о векторно-конвейерных процессорах, которые, в свою очередь могут объединяться в PVP-системы с использованием общей или распределенной памяти. Программная часть архитектуры параллельных компьютеров:
1. SISD (Single Instruction Single Data) – единственный поток команд и единственный поток данных. По сути дела это классическая машина фон Неймана. К этому классу относятся все однопроцессорные системы.
2. SIMD (Single Instruction Multiple Data) – единственный поток команд и множественный поток данных. Типичными представителями являются матричные компьютеры, в которых все процессорные элементы выполняют одну и ту же программу, применяемую к своим локальным данным.
3. MISD (Multiple Instruction Single Date) – множественный поток команд и единственный поток данных. М. Флинн не смог привести ниодногопримера реально существующей системы, работающей на
этом принципе. Некоторые авторы в качестве представителей такой архитектуры называют векторно-конвейерные компьютеры, однако такая точка зрения не получила широкой поддержки.
4. MIMD (Multiple Instruction Multiple Date) – множественный поток команд и множественный поток данных. К этому классу относятся практически все современные многопроцессорные системы.
2. MPI_Cart_create() функциясын қолдану мысалы.
Для создания декартовой топологии (решетки) в MPI предназначена функция: int MPI_Cart_create(MPI_Comm oldcomm, int ndims, int *dims, int *periods, int reorder, MPI_Comm *cartcomm). 1. oldcomm - исходный коммуникатор. 2. ndims - размерность декартовой решетки 3. dims - массив длины ndims, задает количество процессов каждом измерении решетки. 4. periods - массив длины ndims, определяет, является ли решетка периодической вдоль каждого измерения. 5.reorder - параметр допустимости изменения нумерации процессов 6. cartcomm – создаваемый коммуникатор с декартовой топологией процессов.
int dims[3]={0,0,0}, periods[3]={0,0,0},coords[3], ndims=3, reorder=0;; MPI_Cart_create(MPI_COMM_WORLD,ndims,dims,periods,reorder,&cartcomm);
3. 2 өлшемді Лаплас теңдеуін 2-өлшемді декомпозиция тәсілімен программалау.
Сурак
1. Қазіргі параллель архитектуралы компьютерлер. Программалық бөлімі. Основным параметром классификации параллельных компьютеров является наличие общей (SMP) или распределенной памяти (MPP). Нечто среднее между SMP и MPP представляют собой NUMA-архитектуры, где память физически распределена, но логически общедоступна. Кластерные системы являются более дешевым вариантом MPP. При поддержке команд обработки векторных данных говорят о векторно-конвейерных процессорах, которые, в свою очередь могут объединяться в PVP-системы с использованием общей или распределенной памяти. Программная часть архитектуры параллельных компьютеров:
1. SISD (Single Instruction Single Data) – единственный поток команд и единственный поток данных. По сути дела это классическая машина фон Неймана. К этому классу относятся все однопроцессорные системы.
2. SIMD (Single Instruction Multiple Data) – единственный поток команд и множественный поток данных. Типичными представителями являются матричные компьютеры, в которых все процессорные элементы выполняют одну и ту же программу, применяемую к своим локальным данным.
3. MISD (Multiple Instruction Single Date) – множественный поток команд и единственный поток данных. М. Флинн не смог привести ниодногопримера реально существующей системы, работающей на
этом принципе. Некоторые авторы в качестве представителей такой архитектуры называют векторно-конвейерные компьютеры, однако такая точка зрения не получила широкой поддержки.
4. MIMD (Multiple Instruction Multiple Date) – множественный поток команд и множественный поток данных. К этому классу относятся практически все современные многопроцессорные системы.
2. MPI_Dims_create() функциясын қолдану мысалы.
В декартовой топологии функция MPI_DIMS_CREATE помогает пользователю выбрать выгодное распределение процессов по каждой координате в зависимости от числа процессов в группе и некоторых ограничений, определеных пользователем. Эта функция используется, чтобы распределить все процессы (размер группы MPI_COMM_WORLD) в n-мерную топологическую среду. int MPI_Dims_create(int nnodes, int ndims, int *dims)nnodes количество узлов решетки (целое), ndims число размерностей декартовой решетки(целое), dims - целочисленный массив размера ndims, указывающий количество вершин в каждой размерности.
int dims[2]={0,0},ndims=2;
MPI_Dims_create(size, ndims, dims);
3. 3 өлшемді Лаплас теңдеуін 2-өлшемді декомпозиция тәсілімен программалау.
Сурак
1. Shared & distributed memory архитектуралары. Распределенная общая память (DSM - Distributed Shared Memory) Традиционно распределенные вычисления базируются на модели передачи сообщений, в которой данные передаются от процессора к процессору в виде сообщений. Удаленный вызов процедур фактически является той же самой моделью (или очень близкой). DSM - виртуальное адресное пространство, разделяемое всеми узлами (процессорами) распределенной системы. Программы получают доступ к данным в DSM примерно так же, как они работают с данными в виртуальной памяти традиционных ЭВМ. В системах с DSM данные перемещаются между локальными памятями разных компьютеров аналогично тому, как они перемещаются между оперативной и внешней памятью одного компьютера. Конфигурация — с распределенной разделяемой памятью, представляет собой вариант распределенной памяти. Здесь все узлы, состоящие из одного или нескольких процессоров, подключенных по схеме SMP, используют общее адресное пространство. Отличие этой конфигурации от машины с распределенной памятью в том, что здесь любой процессор может обратиться к любому участку памяти. Однако, время обращения к разным участкам памяти для каждого процессора различно в зависимости от того, где участок физически расположен в кластере. По этой причине такие конфигурации еще называют машинами с неоднородным доступом к памяти NUMA (non-uniform memory access). NUMA (Non-Uniform Memory Access) – это архитектура совместного доступа к памяти в многопроцессорных системах, в которой время доступа к участку памяти определяется его расположением относительно процессора. Как и в случае с большинством других свойств процессорных систем, невнимание к особенностям архитектуры может привести к ухудшению работы памяти. К счастью, существует возможность нивелировать проблемы в работе, связанные с характерными особенностями NUMA-архитектур и даже использовать некоторые её преимущества для улучшения работы приложений. Это касается привязки потоков к процессорам, распределения памяти с использованием неявных методов, а также применения системных API для привязки ресурсов и перемещения страниц между узлами вычислительной системы.
2. Нүкте-нүкте коммуникациялары. MPI_Bsend(), MPI_Brecv функцияларын қолдану мысалдары.
К операциям этого типа относятся две представленные в нашем вопросе коммуникационные процедуры. В коммуникационных операциях типа точка-точка всегда участвуют не более двух процессов: передающий и принимающий. В MPI имеется множество функций, реализующих такой тип обменов. Многообразие объясняется возможностью организации таких обменов множеством способов. Эти функции реализуют стандартный режим с блокировкой.
Блокирующие функции подразумевают выход из них только после полного окончания операции, т.е. вызывающий процесс блокируется, пока операция передачи или приема данных не будет завершена.
Префикс B (buffered) -означает буферизованный режим передачи данных. В адресном пространстве передающего процесса с помощью специальной функции создается буфер обмена, который используется в операциях обмена. Операция посылки заканчивается, когда данные помещены в этот буфер. Функция имеет локальный характер.
MPI_Bsend — передача сообщения с буферизацией. Если прием посылаемого сообщения еще не был инициализирован процессом-получателем, то сообщение будет записано в буфер, и произойдет немедленный возврат из функции. Выполнение данной функции никак не зависит от соответствующего вызова функции приема сообщения. Тем не менее, функция может вернуть код ошибки, если места под буфер недостаточно. О выделении массива для буферизации должен заботиться пользователь.
int MPI_Bsend(void *buf, int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm)
buf-адрес начала расположения пересылаемых данных; count– число пересылаемых элементов; datatype – тип посылаемых элементов; dest–номер процесса-получателя в группе, связанной с коммуникатором comm; tag–идентификатор сообщения (аналог типа сообщения функций nread и nwrite PSE nCUBE2); comm – коммуникатор области связи.
MPI_Bsend(&buffer, buffsize, MPI_INT, 1, TAG, MPI_COMM_WORLD);
3. Санды полиномдылыққа тексеру параллельді программасын жазыңыз.
Сурак
Таксономия Флинна. Архитектуры SISD, SIMD.
В литературе часто используется та или иная схема классификации компьютерных архитектур и одной из наиболее популярных является таксономия Флинна. В ее основу положено описание работы компьютера с потоком команд и потоком данных. По Флинну принято классифицировать все возможные архитектуры компьютеров на четыре категории:
SISD (Single Instruction Stream –Single Data Stream) – одинпотоккомандиодинпотокданных;
SIMD (Single Instruction Stream –Multiple Data Stream) – одинпотоккомандимножествопотоковданных;
MISD (Multiple Instruction Stream –Single Data Stream) – множествопотоковкомандиодинпотокданных;
MIMD (MultipleInstructionStream –MultipleDataStream) – множество потоков команд и множество потоков данных.
SISD компьютеры это обычные, "традиционные" последовательные компьютеры, в которых в каждый момент времени выполняется лишь одна операция над одним элементом данных (числовым или каким-либо другим значением). Большинство современных персональных ЭВМ, например, попадает именно в эту категорию. Иногда сюда относят и некоторые типы векторных компьютеров, это зависит от того, что понимать под потоком данных.
SIMD компьютеры состоят из одного командного процессора (управляющего модуля), называемого контроллером, и нескольких модулей обработки данных, называемых процессорными элементами. Управляющий модуль принимает, анализирует и выполняет команды. Если в команде встречаются данные, контроллер рассылает на все процессорные элементы команду, и эта команда выполняется на нескольких или на всех процессорных элементах. Каждый процессорный элемент имеет свою собственную память для хранения данных. Одним из преимуществ данной архитектуры считается то, что в этом случае более эффективно реализована логика вычислений. До половины логических инструкций обычного процессора связано с управлением выполнением машинных команд, а остальная их часть относится к работе с внутренней памятью процессора и выполнению арифметических операций. В SIMD компьютере управление выполняется контроллером, а "арифметика" отдана процессорным элементам. Векторные компьютеры представляют собой пример архитектуры SIMD.
2 Что такое MPI? Основные концепции и возможности.
Message Passing Interface (MPI, интерфейс передачи сообщений) — программный интерфейс (API) для передачи информации, который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу. Разработан Уильямом Гроуппом, Эвином Ласком и другими. MPI является наиболее распространённым стандартом интерфейса обмена данными в параллельном программировании, существуют его реализации для большого числа компьютерных платформ. Используется при разработке программ для кластеров и суперкомпьютеров. В настоящее время существует большое количество бесплатных и коммерческих реализаций MPI. Существуют реализации для языков Фортран 77/90,Java, Си и Си++.
В первую очередь MPI ориентирован на системы с распределенной памятью, то есть когда затраты на передачу данных велики. Базовым механизмом связи между MPI процессами является передача и приём сообщений. Сообщение несёт в себе передаваемые данные и информацию, позволяющую принимающей стороне осуществлять их выборочный приём:отправитель — ранг (номер в группе) отправителя сообщения;получатель — ранг получателя;признак — может использоваться для разделения различных видов сообщений;коммуникатор — код группы процессов.
В числе основных достоинств MPI по сравнению с интерфейсами других коммуникационных библиотек обычно называют следующие его возможности: возможность использования в языках Фортран, Си, Си++; предоставление возможностей для совмещения обменов сообщениями и вычислений; предоставление режимов передачи сообщений, позволяющих избежать излишнего копирования информации для буферизации; широкий набор коллективных операций допускающих гораздо более эффективную реализацию параллельной программы; удобные средства именования адресатов сообщений, упрощающие разработку стандартных программ или разделение программы на функциональные блоки.
Однако разработчики MPI подвергаются суровой критике за то, что интерфейс является слишком громоздким и сложным для прикладного программиста. Интерфейс оказался сложным и для реализации.