Лабораторная работа №7 mpi: Передача упакованных данных Лабораторный практикум Математический факультет



Скачать 60.35 Kb.
Дата07.11.2016
Размер60.35 Kb.


ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

КЕМЕРОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Кафедра ЮНЕСКО по новым информационным технологиям

Параллельное программирование


ЛАБОРАТОРНАЯ РАБОТА №7
MPI: Передача упакованных данных

Лабораторный практикум



Математический факультет

Специальность 010503 – математическое обеспечение и администрирование

информационных систем

Кемерово, 2009


  1. Цель работы:


Изучить возможность библиотеки MPI для упаковки данных перед передачей и распаковкой после приема.
  1. Методические указания


Требования к результатам выполнения лабораторного практикума:

  • при выполнении задания необходимо сопровождать все проделанные действия скриншотами и описаниями к ним;

  • также необходимо придерживаться строгой последовательности действий при выполнении заданий;

  • сделать общий вывод;

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

При составлении и оформлении отчета следует придерживаться рекомендаций, представленных на странице http://unesco.kemsu.ru/student/rule/rule.html.
  1. Теоретический материал


Функция MPI_Pack упаковывает элементы предопределенного или производного типа MPI, помещая их побайтное представление в выходной буфер.

FORTRAN:



INBUF(*), OUTBUF(*)

INTEGER INCOUNT, DATATYPE, OUTSIZE, POSITION, COMM, IERROR

MPI_PACK(INBUF, INCOUNT, DATATYPE, OUTBUF, OUTSIZE,

POSITION, COMM, IERROR)

C:

int MPI_Pack(void* inbuf, int incount, MPI_Datatype datatype,



void *outbuf, int outsize, int *position, MPI_Comm comm)

Входные параметры:

inbuf

-

адрес начала области памяти с элементами, которые требуется упаковать;

incount

-

число упаковываемых элементов;

datatype

-

тип упаковываемых элементов;

outsize

-

размер выходного буфера в байтах;

comm

-

коммуникатор.

Выходные параметры:

outbuf

-

адрес начала выходного буфера для упакованных данных;

position

-

текущая позиция в выходном буфере в байтах.

Функция MPI_Pack упаковывает incount элементов типа datatype из области памяти с начальным адресом inbuf. Результат упаковки помещается в выходной буфер с начальным адресом outbuf и размером outsize байт. Параметр position указывает текущую позицию в байтах, начиная с которой будут размещаться упакованные данные. На выходе из подпрограммы значение position увеличивается на число упакованных байт, указывая на первый свободный байт. Параметр comm при последующей посылке упакованного сообщения будет использован как коммуникатор.

Функция MPI_Unpack извлекает заданное число элементов некоторого типа из побайтного представления элементов во входном массиве.

FORTRAN:

MPI_UNPACK(INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT,

DATATYPE, COMM, IERROR)



INBUF(*), OUTBUF(*)

INTEGER INSIZE, POSITION, OUTCOUNT, DATATYPE, COMM, IERROR

C:

Int MPI_Unpack(void* inbuf, int insize, int *position, void *outbuf, int outcount, MPI_Datatype datatype, MPI_Comm comm)



Входные параметры:

inbuf

-

адрес начала входного буфера с упакованными данными;

insize

-

размер входного буфера в байтах;

position

-

текущая позиция во входном буфере в байтах;

outcount

-

число извлекаемых элементов;

datatype

-

тип извлекаемых элементов;

comm

-

коммуникатор.

Выходные параметры:

outbuf

-

адрес начала области памяти для размещения распакованных элементов;

position

-

текущая позиция в входном буфере в байтах.

Функция MPI_Unpack извлекает outcount элементов типа datatype из побайтного представления элементов в массиве inbuf, начиная с адреса position. После возврата из функции параметр position увеличивается на размер распакованного сообщения. Результат распаковки помещается в область памяти с начальным адресом outbuf.

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

Упакованный буфер пересылается любыми коммуникационными операциями с указанием типа MPI_PACKED и коммуникатора comm, который использовался при обращениях к функции MPI_Pack.

Полученное упакованное сообщение распаковывается в различные массивы или переменные. Это реализуется последовательными вызовами функции распаковки MPI_Unpack с указанием числа элементов, которое следует извлечь при каждом вызове, и с передачей значения position, возвращенного предыдущим вызовом. При первом вызове функции параметр position следует установить в 0. В общем случае, при первом обращении должно быть установлено то значение параметра position, которое было использовано при первом обращении к функции упаковки данных. Очевидно, что для правильной распаковки данных очередность извлечения данных должна быть той же самой, как и при упаковке.

Функция MPI_Pack_size помогает определить размер буфера, необходимый для упаковки некоторого количества данных типа datatype.

C:


int MPI_Pack_size(int incount, MPI_Datatype datatype,

MPI_Comm comm, int *size)

FORTRAN:

MPI_PACK_SIZE(INCOUNT, DATATYPE, COMM, SIZE, IERROR)



INTEGER INCOUNT, DATATYPE, COMM, SIZE, IERROR

Входные параметры:

incount

-

число элементов, подлежащих упаковке;

datatype

-

тип элементов, подлежащих упаковке;

comm

-

коммуникатор.

Выходные параметры:

size

-

размер сообщения в байтах после его упаковки.

Первые три параметра функции MPI_Pack_size такие же, как у функции MPI_Pack. После обращения к функции параметр size будет содержать размер сообщения в байтах после его упаковки.

  1. Примеры


  1. PROGRAM EXAMPLE

  2. INCLUDE 'mpif.h'

  3. INTEGER my_id, np, ierr, status(MPI_Status_size)

  4. integer pos,b,count

  5. REAL a

  6. character buff(1000)

  7. CALL MPI_Init(ierr)

  8. CALL MPI_Comm_Size(mpi_comm_world, np, ierr)

  9. CALL MPI_Comm_Rank(mpi_comm_world, my_id, ierr)

  10. IF (my_id.EQ.0) Then

  11. a=10.0

  12. b=5

  13. pos=0

  14. MPI_Pack(a,1,MPI_real,buff,1000,pos,MPI_COMM_WORLD,ierr)

  15. MPI_Pack(b,1,MPI_INT,buff,1000,pos, MPI_COMM_WORLD,ierr)

  16. CALL MPI_Send(Buf,pos,MPI_packed,1,1, mpi_comm_world,ierr)

  17. else

  18. call mpi_probe(0, 1, mpi_COMM_world, STATUS, IERR)

  19. call mpi_get_count(STATUS, mpi_packed, COUNT, IERR)

  20. CALL MPI_Recv(Buf,count, MPI_packed,0,1, mpi_comm_world,status,ierr)

  21. pos=0

  22. MPI_unPack(buff,1000,pos,a,1,MPI_real,MPI_COMM_WORLD,ierr)

  23. MPI_unPack(buff,1000,pos,b,1,MPI_int,MPI_COMM_WORLD,ierr)

  24. Write(*,*) my_id,': a=',a, ‘b=’,b

  25. end if

  26. CALL MPI_Finalize(ierr)

  27. STOP

  28. END


  1. Вопросы


  1. С помощью какой функции можно упаковать разнотипные данные в один непрерывный буфер для последующей пересылки?

  2. Какой тип данных в коммуникационных функциях требуется указывать при пересылке упакованных данных?

  3. Какие возможности обеспечивают функции pack/unpack, которые недоступны в MPI другим способом?

  4. Укажите разницу при использовании параметра count в разных функциях: MPI_Recv (…, count, …) и MPI_Unpack (…,count,…) .

  5. Можно ли распаковывать результат как один упакованный объект, если перед посылкой происходила упаковка двух объектов?
  1. Упражнения


  1. Создайте и выполните программу, используя функции упаковки и распаковки данных для передачи разнотипных констант - REAL, REAL*8, INTEGER, CHARACTER.



  1. Упражнения для самостоятельного выполнения


Создайте параллельные программы, передающие нечетные элементы одномерного массива с нулевого процессора на первый. Требуется рассмотреть три варианта: передача данных поэлементно, передача массива целиком, упаковка данных перед передачей данных. Для всех случаев определите время, затрачиваемое на передачу данных. Поясните полученные результаты эксперимента.



База данных защищена авторским правом ©bezogr.ru 2016
обратиться к администрации

    Главная страница