Примеры программ с mpi

Ответить однозначно на вопрос о том, для чего нужно знать, как производится распиновка RJ45 и обжимка кабеля в домашних условиях, сложно. В первую очередь распиновка востребована людьми, которые надумали провести в квартире ремонт. Банальная замена кабеля, торчащего из оконной рамы, и разведение высокоскоростной сети по комнатам служит второй причиной. Третьим нужно подключить специфическое оборудование, кому-то хочется играть по сети между двумя компьютерами. Знания лишними не бывают.

О кабеле и инструменте

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

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

Параллельные процессы MPI

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

Технология обжима кабеля

Распиновка кабеля RJ45 требует специальной подготовки. Главное — запомнить, что технология неизменна для обжимки кабеля. Меняется лишь последовательность цветов жил кабеля.

  1. Аккуратно срезается верхний слой обмотки. Длина среза порядка 5-6 см для удобства разводки.
  2. Выстроенные в необходимый цветовой ряд жилы срезаются ножницами так, чтобы длина от кончиков до основания общего кабеля не превышала 3 см.
  3. Удерживая пластиковую вилку RJ45 зажимной клипсой вниз, жилы аккуратно вставляются в корпус. Если присмотреться, для каждой жилы отведен специальный канал, в который невозможно вставить два кабеля. Главное, выдержать нужную последовательность.
  4. Приложив небольшое усилие, убедиться, что концы жил касаются медных вставок на краю обжимного коннектора.
  5. Не давая кабелю выскользнуть из разъема, аккуратно произвести обжимку каждой жилы, надавливая отверткой или ножом на медную вставку. Можно аккуратно усилить нажим ударом молотка.

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

Технология разводки кабеля в розетке

Распиновка розетки RJ45 не требует никакого специализированного оборудования, поэтому разводка локальной сети по объекту выполняется с большим удовольствием и быстротой. Понадобится всего один инструмент — маникюрные ножницы либо маленький ножик с тонким лезвием.

Лекция 2. Основные функции библиотеки MPI.

  1. Аккуратно срезается верхний слой обмотки. Длина среза порядка 10 см для удобства разводки.
  2. Разматываются скрутки всех пар и выравниваются провода так, чтобы от основания верхнего слоя до кончиков жил они не пересекались.
  3. Любая розетка имеет две цветовые маркировки. «А» — подключение кросс, «В» — подключение стандарт. По последней маркировке и осуществляется распиновка RJ45.
  4. Приложив основание оплетки к плате, сначала жилы вставляются в дальние разъемы. Обязательно проконтролировать натяжку кабеля, чтобы расстояние от оплетки до зажима не превышало 3 см.
  5. Закрепив жилы кабеля в нужных коннекторах, производится обжимка. Удерживая маникюрные ножницы так, чтобы угол режущих направляющих составлял 45 градусов, необходимо осуществить нажим на жилу сверху до характерного металлического щелчка.

Монтаж розетки на столетие

Главное, что нужно учитывать при монтаже сетевой розетки на стену, это положение разъемов по отношению к полу. Разъемы всегда должны быть направлены вниз. Во-первых, это предохраняет контакты от засорения пылью и попадания влаги. Во-вторых, при быстром подключении кабеля снизу, меньше шансов нечаянно сбить крепление розетки на стене. Даже с эстетической точки зрения, подключение кабеля снизу не так сильно бросается в глаза и не портит красивой обстановки в комнате.

Помимо прямого назначения, компьютерную сетевую розетку используют для передачи посторонних сигналов (телефония, стереозвук, видеосигнал). Ведь ни для кого не секрет, что для подключения Интернета распиновка RJ45 критична для четырех жил, остальные либо запасные, либо для гигабитных сетей, которые в странах постсоветского пространства в домашнем обиходе не организовываются.

Подключение к сети Интернет стандартным способом

Распиновка RJ45 по цветам при создании кабеля для соединения персонального компьютера с сетевым оборудованием выглядит так.

  1. Бело-оранжевый.
  2. Оранжевый.
  3. Бело-зеленый.
  4. Синий.
  5. Бело-синий.
  6. Зеленый.
  7. Бело-коричневый.
  8. Коричневый.

Если есть потребность по одному кабелю произвести подключение к двум компьютерам или пустить по свободным жилам другой сигнал, то распиновка производится по двум парам — зеленой и оранжевой, с соблюдением последовательности и нумерации в разъеме. То есть коннекты 1, 2, 3, 6 в вилке RJ45 должны быть заняты согласно своим цветовым распределениям.

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

Соединение между собой двух компьютеров

В последнее время распиновка RJ45 компьютер-компьютер не является востребованной. Ведь большинство современных сетевых адаптеров научились понимать, чего от них добивается пользователь. Информация пригодится тем владельцам, чьи адаптеры не умеют «переворачивать» жилы в сетевой вилке.

Такой кабель подойдет и для подключения двух сетевых концентраторов, в которых нет переключателя Uplink. Для простоты запоминания цветовой распиновки кросс-кабеля достаточно увидеть, что пары 1-2 поменялись местами с парами 3-6. Остальным цветовым парам стоит уделить внимание в том случае, если сетевые адаптеры умеют работать в гигабитных сетях, иначе их можно задействовать для других нужд.

Подключение периферийного оборудования

Вряд ли большинству пригодится распиновка RJ45-USB, но получить знания о ней не помешает. Такое странное подключение активно используется при подключении дорогостоящих серверных систем, а также довольно популярно в банковской отрасли, при подключении оргтехники и кассовых аппаратов. Лучше сделать распиновку с помощью паяльника, но при его отсутствии работать будет все и на скрутках.

Полностью обжатый кабель в вилке RJ45 обрезается ножом на необходимую длину. Обрезанный конец зачищается от обмотки на 5 см. Разбирается любая вилка USB-кабеля либо обрезается так, чтобы был доступ к разъемам. Прежде чем обрезать провода в USB-вилке, нужно зачистить до медного основания красный и черный кабель и скрутить между собой. После всех манипуляций производится следующее соединение RJ45 с USB.

  1. Бело-зеленая жила из третьего коннекта припаивается к красно-черной скрутке USB (GND).
  2. Синяя жила из четвертого разъема присоединяется к зеленому кабелю USB (RX).
  3. Бело-синяя жила из пятого коннекта соединяется с белым кабелем USB (TX).
Читайте также:
Для решения каких задач предназначены программы площадь и земельный план

Для прочности конструкции можно воспользоваться изолентой.

В заключение

Распиновка RJ45 не должна составить особых трудностей. Не стоит волноваться, что из-за некачественной обжимки пропадет канал связи или произойдет короткое замыкание. Ничего подобного даже в теории не будет.

Работая неаккуратно ножом или отверткой вместо профессионального инструмента, можно лишь создать в линии небольшие помехи, которые сводятся к нулю на отрезках кабеля до пяти метров. Но всё же нужно стремиться к достижению максимального результата. Лучше сделать один раз, но выполнить работу качественно и навсегда.

Витая пара или в простонародье «ютипишка» (от аббревиатуры UTP — u nshielded t wisted p air) на сегодняшний день является самым распространённым решением для передачи информации в информационных цифровых сетях. Это связано с низкой себестоимостью и простотой в монтаже. Витую пару используют в структурированных кабельных сетях (СКС), компьютерных сетях, телевидении, телефонии и прочих системах где передается информация в цифровом (пакетном) виде. В связи с повсеместным использованием, в современном мире очень важно уметь правильно обжимать UTP кабель разъемом Rj45. Способность эта ценится так же сильно, как и умение в два счёта починить розетку.

Необходимое оборудование.

Для работы Вам обязательно потребуется следующие инструменты и материалы:

Кабель. По другому «сетевой кабель» или «интернет кабель». Правильно называется «витая пара», бывает категории 5e или 6. Большей популярностью пользуются кабеля категории cat. 5e – из-за своей функциональности. Для практически всех видов работ вам его будет достаточно. Внимание !

В соответствии с стандартом TIA/EIA-568-B максимальная длинная линии категории 5e может составлять не более 90м + 10% запаса, то есть фактическая рекомендуемая длинна кабеля не должна превышать 100м. В зависимости от фирмы изготовителя, качества прокладки, внешних электромагнитных наводок — возможное расстояние передачи сигнала может варьироваться.

Разъемы. Здесь Вам понадобиться разъемы RJ-45 (8P8C). Тем у кого мало опыта в опресовке — обжиме витой пары, мы рекомендуем запастись как минимум 2 «коннекторами» Rj45. Если в магазине не понимают, что Вам нужно, то спросите у продавца ещё одно их название – коннектор 8P8C.

Стоимость разъемов 8P8C в розницу начинается от 20-30 рублей за штуку, при покупке упаковке 100 штук можно сэкономить от 50% до 200%. Коннекторы бывают для кабеля категории 5е и категории 6, основное отличие в том что у кабеля 6-ой категории и выше — сечении жилы 23AWG (диаметр 0.573мм) что существенно больше чем у витой пары 5-ой категории, у которой 24AWG (диаметр 0.511мм). Так же RJ45 делятся на 2 типа: для не экранированного UTP кабеля и экранированного FTP кабеля. По внешнему виду их легко отличить, вторые — FTP «окутаны» в металлизированную оболочку. Вот как выглядят коннекторы для категории 5е:

Так же RJ-45 разделяются по способу ввода кабеля: Без вставки — подходят только для одножильного кабеля. Как правило они самые удобные и распространенные. Вы видели их на картинках выше.

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

Кстати AWG — это American Wire Gauge System что в переводе на русский означает «Американская система калибров проводов». Самое интересное тут то, чточем больше значение , тем меньше диаметр жилы .

— Оборудование. В идеале, удобнее обжимать, имея обжимные клещи (их ещё называют просто «обжимка» или по оригинальному названию – кримпер), а так же устройство для разделки кабеля. Вот как выглядят самые распространенные модели кримперов (обжимок):

Так же для зачистки кабеля Вам понадобиться стриппер — по русски Зачистка. Слово стриппер как несложно догадаться пошло от английского слова Stripper — съемник. Штука снимающая изоляцию. Выглядят стрипперы вот так:

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

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

Стандарты.

Всего в мире используются 2 стандарта для обжима витой пары: TIA/EIA-568A и TIA/EIA-568B . Они практически одинаковые, но их легко перепутать не только из-за этого. Подвох в том, что главное отличие этих стандартов кроется в цветах пар: 568А использует для передачи информации зелёную пару, а для приёма – оранжевую, а стандарт 568В делает всё зеркально. То есть, в 568В информация передаётся через оранжевую пару, а зелёная пара информацию принимает. Именно второй вариант очень часто используется в России. Стандарт 568А использую только в 3% случаев, как показывает статистика, поэтому дальше мы рассмотрим только витую пару 568В.

В этой заметке показано как установить MPI, подключить его к Visual Studio, а затем использовать с заданными параметрами (числом вычислительных узлов). В статье используется Visual Studio 2015, т.к. именно с ней возникали проблемы у моих студентов (эта заметка написана студентами для студентов), однако вероятно инструкция подойдет и для других версий.

Шаг 1:
Необходимо установить пакет HPC Pack 2008 SDK SP2 (в вашем случае может быть уже другая версия), доступный на официальном сайте Microsoft. Разрядность пакета и системы должны соответствовать.

Шаг 2:
Необходимо настроить пути, для этого переходим во вкладку Debug — Properties:

“C:Program FilesMicrosoft HPC Pack 2008 SDKInclude”

В поле Library Directories:

“C:Program FilesMicrosoft HPC Pack 2008 SDKLibamd64”

В поле с библиотеками, если стоит 32 разрядная версия, вместо amd64 нужно прописать i386.

Для настройки запуска необходимо перейти во вкладку Debugging и в поле Command указать:

“C:Program FilesMicrosoft HPC Pack 2008 SDKBinmpiexec.exe”

В поле Command Arguments указать, например,

Число 4 указывает на количество процессов.

Для запуска программы необходимо подключить библиотеку

Путь к проекту не должен содержать кириллицу. При возникновении ошибок можно воспользоваться Microsoft MPI, доступный по на сайте Microsoft.

Для этого после установки достаточно прописать в поле Command вкладки Debugging путь:

“C:Program FilesMicrosoft MPIBinmpiexec.exe”

Также перед запуском программы не забудьте указать её разрядность:

Пример запуска программы с MPI :

Читайте также:
Субд это прикладная программа

Популярное

Что такое молл на Алиэкспресс? Чем покупки в молл.

Как установить дополнения на бесконечное лето Можно без всякого.

Фоллаут 4 ключ от хранилища хэнкока Задание игры Fallout 4.

Стандартное с помощью Nexus Mod Manager Убить Когтя Смерти в.

Профессия Trouble-shooter–человек, решающий проблемы Решение любых проблем за деньги Их называют трабл-шутерами.

Источник: geekpad.ru

Основные функции MPI и пример простейшей программы

Приветствую всех в третьей статье посвященной параллельному программированию с помощью библиотеки MPICH. В прошлых сериях мы научились устанавливать MPI в Linux Ubuntu и заставили Eclipse понимать код библиотеки. Наконец пришло время взяться за программирование. А какую программу должен написать каждый уважающий себя программист?

Правильно, сегодня мы напишем «Hello World» на MPI, и заодно глянем на самые базовые функции библиотеки. Поехали!

Основные функции MPI

Я сейчас говорю о тех, которые помогут нам грамотно идентифицировать каждый процесс, чтобы управлять общей логикой приложения. Реализовано это следующим образом: все процессы делятся на группы, называемые коммуникаторами, при этом один процесс может находиться сразу в нескольких коммуникаторах. По умолчанию все процессы попадают в коммуникатор MPI_COMM_WORLD . Каждый процесс имеет порядковый номер в коммуникаторе, называемый рангом. Как правило, процесс с рангом 0 назначается главным, он рулит бизнес логикой приложения и раздает команды другим процессам, еще он может отвечать за вывод в консоль, если вывод предусмотрен.

Но прежде чем начать рулить процессами, нужно их инициализировать с помощью функции MPI_Init(int *argc, char ***argv) , которая принимает аргументы командной строки и раздает их процессам. А после завершения грамотно оборвать все связи и убить процессы функцией MPI_Finalize() .

Перечень основных функций MPI

MPI_Initi(int *argc, char ***argv) — как уже было сказано, инициализирует все процессы и раздает им аргументы командной строки. По умолчанию, все вновь созданные процессы принадлежат стандартному коммуникатору MPI_COMM_WORLD ;

MPI_Finalize() — обрывает связи и убивает процессы;

MPI_Comm_size(MPI_Comm comm, int* size) — Функция запишет в переменную size количество процессов в коммуникаторе comm. Для того, чтобы узнать общее число процессов следует первым аргументом передать стандартный коммуникатор MPI_COMM_WORLD;

MPI_Comm_rank(MPI_Comm comm, int* rank) — Функция запишет в переменную rank ранг процесса в коммуникаторе comm. Это и есть способ идентифицировать процесс для того, чтобы отдать ему какую либо логику. Разделение полномочий между процессами осуществляется с помощью условных конструкций, например, if (rank == 0) < … >или switch(rank) < … >.

Простейшая программа с использованием библиотеки MPI

Этих функций нам уже вполне достаточно для того, чтобы написать «Hello World» на MPI. Пусть каждый процесс поздоровается с миром от своего имени, а главный, нулевой процесс в свою очередь расскажет миру о том, сколько процессов у него в подчинении(считая себя, конечно же, контроль над собой терять нельзя).

#include «mpi.h» int main(int argc, char **argv) < int rank, size; MPI_Init(argv); //Количество процессов в этом коммуникаторе MPI_Comm_size(MPI_COMM_WORLD, //Ранг процесса MPI_Comm_rank(MPI_COMM_WORLD, if(rank == 0) < printf(«Hello world, Im main process! There are %d processes in my comm.n», size); > else < printf(«Hello world! Im %d process in comm.n», rank); > MPI_Finalize(); return 0; >

Заключение

Нехитрое дело сделано, в следующей серии будет обмен сообщениями между процессами и какое нибудь задание поинтереснее, но начинать всегда нужно с «Hello world»! А на сегодня у меня все, спасибо за внимание!

Подписывайтесь на рассылку чтобы не пропустить продолжение.

Источник: mindhalls.ru

2. Основы параллельного программирования средствами mpi

Теперь обратимся к основной части настоящего пособия – рассмотрению интерфейса передачи сообщений MPI (Message Passing Interface). Первый стандарт интерфейса появился в 1994 году и за прошедшие 10 лет MPI стал наиболее распространенным средством разработки параллельных приложений. В немалой степени этому способствовало наличие не только коммерческих, но и свободно распространяемых его реализаций, к которым, в частности, относится MPICH (последние версии доступны для свободной загрузки с сайта www.mpi.org) . Существуют версии MPICH как для операционных систем семейства Unix/Linux, так и для Windows NT/2000/XP.

Физически MPI представляет собой специальную библиотеку функций, которые отвечают за организацию взаимодействия между процессорами системы. Эти функции могут вызываться из обычных программ, написанных на языках С/С++ или Fortran. Стандарт MPI-1.1 [1] предусматривает обязательное наличие в библиотеке 129 функций.

Тем не менее, как отмечает в своей книге Ян Фостер [2], для успешного написания практически любого параллельного приложения достаточно 24 функций MPI. Более того, формально любая параллельная программа может быть написана с использованием всего шести (!) функций MPI (вопрос эффективности такой программы, естественно, не обсуждается). Что же это за функции? На самом деле, с четырьмя из них мы уже знакомы (они введены в предыдущей главе): это функции передачи и приема сообщений, а также определения номера процессора и количества процессоров. Как нетрудно догадаться, две другие функции – это функции инициализации и завершения MPI. Таким образом, имеем следующий набор из шести базовых функций MPI:

MPI_Init – инициализация параллельной части приложения;

MPI_Finalize – завершение параллельной части приложения;

MPI_Comm_size – определение числа процессов;

MPI_Comm_rank – определение номера процесса;

MPI_Send – передача сообщения от одного процесса другому;

MPI_Recv – прием сообщения от одного процесса другим.

Читатель, наверное, заметил, что при описании назначения функций вместо слова “процессор” было использовано слово “процесс”. Это не случайно. MPI оперирует понятием именно процесса, а не процессора, и любая параллельная программа рассматривается как совокупность независимых процессов.

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

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

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

#include “mpi.h”

int main(int argc, char *argv[])

int S=0; /* искомая сумма */

int k; /* переменная цикла */

int SAdd; /* вспомогательная переменная */

int NumProc; /* количество процессов */

int MyID; /* номер процесса */

int tag; /* метка сообщения */

MPI_Status status; /* структура, содержащая

информацию о полученном

/* инициализация MPI */

/* определение количества

активных процессов */

/* определение номера текущего процессора */

/* вычисление куба числа

на каждом процессоре */

Читайте также:
Как называется программа для скидочных карт на Андроид

/* передача результатов со всех процессоров

на процессор с номером 0 и вычисление на

этом процессоре окончательной суммы */

/* печать результата на экран */

printf(“Sum is equal to %d”,S);

/* завершение работы с MPI */

/* нормальное завершение работы программы */

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

Имена элементов MPI являются составными и отражают иерархическую структуру интерфейса. Любой элемент, будь то функция, константа или собственный тип данных, начинается с префикса “MPI_”. Затем могут следовать сокращенные названия группы и подгруппы, к которым относится элемент, и, наконец, в конце стоит собственное имя элемента, отражающее его функциональное назначение. Все составляющие полного имени разделяются знаком нижнего подчеркивания. Поскольку язык С чувствителен к регистру, для него принят следующий стандарт записи: предопределенные константы и названия типов данных записываются заглавными буквами, а в именах функций и типов после префикса MPI_ первая буква заглавная, остальные – строчные. Например,

MPI_COMM_WORLD – предопределенный коммуникатор (константа);

MPI_INT – тип данных;

MPI_Datatype – специальный тип, который имеют все типы

данных MPI, включая создаваемые

Все имена элементов MPI описаны в заголовочном файле mpi.h, поэтому при написании параллельной MPI-программы этот файл обязательно должен быть подключен соответствующей препроцессорной директивой:

#include “mpi.h”

Перейдем теперь к детальному рассмотрению базовых MPI-функций.

▲ int MPI_Init(int *argc, char **argv[]);

Функция инициализации MPI. Может использоваться в любой параллельной программе только один раз и размещается в начале параллельного участка кода программы. Аргументы функции совпадают с аргументами главной функции программы main, в которой argc – число аргументов командной строки, argv[] – массив строк, содержащих аргументы командной строки. В частности, при запуске параллельной MPI программы с помощью команды mpirun одним из обязательных аргументов командной строки является количество процессов, выделяемых программе (см. приложение). Поэтому указание параметров argc и argv[] в main является обязательным. Возвращаемые функцией MPI_Init значения являются предопределенными константами:

MPI_SUCCESS – возвращается в случае успешного

MPI_ERR_ARG – ошибка неправильного задания аргумента,

MPI_ERR_INTERN – внутренняя ошибка (нехватка памяти),

MPI_ERR_UNKNOWN – неизвестная ошибка.

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

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

▲ int MPI_Finalize(void);

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

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

▲ int MPI_Comm_size(MPI_Comm comm, int* size);

Функция определения количества процессов size в коммуникационной группе (communication domain) с коммуникатором comm. Имя коммуникатора comm является входным параметром функции, а целочисленный идентификатор size – выходным параметром.

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

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

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

▲ int MPI_Comm_rank (MPI_comm comm, int* rank);

Функция, возвращающая номер rank вызвавшего ее процесса, входящего в коммуникационную группу с коммуникатором comm.

▲ int MPI_Send(void* sbuf, int count,

MPI_Datatype datatype, int dest,

int tag, MPI_Comm comm);

Блокирующая функция передачи данных. Все параметры функции являются входными параметрами:

  • sbuf– адрес в памяти, начиная с которого размеща-
  • count – количество передаваемых элементов;
  • datatype– тип передаваемых элементов;
  • dest– номер процесса-получателя сообщения;
  • tag– метка передаваемого сообщения;
  • comm– коммуникатор.
  1. При передаче скалярных данных в качестве sbuf традиционно используется ссылка на передаваемое значение (см. приведенный выше пример).
  2. Допускается задание нулевого значения в качестве количества передаваемых элементов count; в этом случае, очевидно, ничего не передается.
  3. В качестве datatype может использоваться либо созданный пользователем тип данных типа MPI_Datatype, либо одна из предопределенных констант типа:
  1. В качестве значения dest может использоваться любое неотрицательное целое число от 0 до np-1, где np – общее количество процессов в коммуникационной группе с заданным коммуникатором comm. При этом разрешается указывать в качестве dest номер процесса-отправителя сообщения, т.е. процессу разрешается передавать сообщения самому себе.
  2. Для того чтобы различать сообщения, с которыми работает процесс, каждому сообщению назначается своя уникальная метка tag. В качестве метки может использоваться любое целое число из диапазона от 0 до 32767, либо целочисленное выражение, принимающее значение в этом диапазоне. Достаточно часто для обеспечения уникальности метки сообщения используется следущее правило ее построения:
  1. Принадлежность функции MPI_Sendк типу блокирующих функций приема-передачи данных означает, что изменение значений в переменных, связанных сsbuf, возможно сразу же после вызова функции. При этомMPI_Sendвозвращает управление процессу не дожидаясь окончания передачи данных.
  • count – количество получаемых элементов;
  • datatype– тип получаемых элементов;
  • source– номер процесса-отправителя сообщения;
  • tag– метка принимаемого сообщения;
  • comm– коммуникатор.
  • rbuf– адрес в памяти, начиная с которого размещаются
  • status–структура, содержащая информацию о принятом сообщении.
  1. Принадлежность функции MPI_Recvк типу блокирующих функций приема-передачи данных гарантирует, что после успешного ее завершения все элементы сообщения приняты и расположены в буфере rbuf. До тех пор, пока сообщение полностью не принято, процесс-получатель не выполняет дальнейших операций.
  2. Число элементов в принимаемом сообщении может быть меньше (но не больше!) заданного значения count. В этом случае стандартом MPI гарантируется, что в буфере приема rbuf будут изменены только те элементы, которые соответствуют принимаемому сообщению.
  3. На практике иногда возникают ситуации, когда заранее неизвестен номер процесса-отправителя сообщения или/и метка принимаемого сообщения. В этом случае можно использовать предопределенные константы MPI (так называемые джокеры):
  • MPI_ANY_SOURCE– указывается на месте номера процесса-отправителяsourceи означает готовность принять сообщение от любого процесса данной коммуникационной группы;
  • MPI_ANY_TAG– указывается на месте метки сообщенияtagи означает готовность принять сообщение с любым допустимым значением метки.

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru