Теория и практика параллельных вычислений


Формирование сообщений при помощи упаковки и распаковки данных - часть 2


После получения сообщения с типом MPI_PACKED данные могут быть распакованы при помощи функции:

int MPI_Unpack(void *buf, int bufsize, int *bufpos, void *data, int count, MPI_Datatype type, MPI_Comm comm),

где

  • buf — буфер памяти с упакованными данными;
  • bufsize — размер буфера в байтах;
  • bufpos — позиция начала данных в буфере (в байтах от начала буфера);
  • data — буфер памяти для распаковываемых данных;
  • count — количество элементов в буфере;
  • type — тип распаковываемых данных;
  • comm — коммуникатор для упакованного сообщения.

Функция MPI_Unpack распаковывает, начиная с позиции bufpos, очередную порцию данных из буфера buf и помещает распакованные данные в буфер data. Общая схема процедуры распаковки показана на рис. 5.8б.

Начальное значение переменной bufpos должно быть сформировано до начала распаковки и далее устанавливается функцией MPI_Unpack. Вызов функции MPI_Unpack осуществляется последовательно для распаковки всех упакованных данных, при этом порядок распаковки должен соответствовать порядку упаковки. Так, в ранее рассмотренном примере упаковки для распаковки упакованных данных необходимо выполнить:

bufpos = 0; MPI_Unpack(buf, buflen, &bufpos, &a, 1, MPI_DOUBLE, comm); MPI_Unpack(buf, buflen, &bufpos, &b, 1, MPI_DOUBLE, comm); MPI_Unpack(buf, buflen, &bufpos, &n, 1, MPI_INT, comm);

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




Начало  Назад  Вперед



Книжный магазин