next up previous contents
Next: Функции передачи сообщений MPI_Send() Up: Интерфейс передачи сообщений MPI Previous: Определение номера процесса   Contents

Структура сообщения

Фактическая передача сообщений в программе выполняется функциями MPI_Send() и MPI_Recv(). Первая функция посылает сообщение определенному процессу. Вторая получает сообщение от некоторого процесса. Эти функции являются самыми основными командами передачи сообщений в MPI. Чтобы сообщение было успешно передано, система должна добавить немного информации к данным, которые "желает" передать прикладная программа. Эта дополнительная информация формирует конверт сообщения. В MPI конверт содержит следующую информацию:

Эти детали могут использоваться приемником, чтобы распознавать поступающие сообщения. Аргумент source применяется, чтобы различать сообщения, полученные от разных процессов. Тэг представляет собой указанное пользователем значение int, которое предназначено, чтобы отличить сообщения, полученные от одного процесса. Пусть процесс А посылает два сообщения процессу B; оба сообщения содержат одно значение типа float. Одно из значений должно использоваться в вычислении, а другое должно быть выведено на экран. Чтобы определить, какое из них первое, А использует различные тэги этих сообщений. Если B употребляет те же самые тэги при приеме, он будет "знать", что с ними делать. MPI предполагает, что в качестве тэгов могут применяться целые числа в диапазоне 0 - 32767. Большинство реализаций позволяет использовать гораздо большие значения.

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



2004-06-22