Упаковка-распаковка данных для передачи

Слайд 2

Упаковка-распаковка данных для передачи

Для компактной пересылки разнородных данных можно использовать операции

Упаковка-распаковка данных для передачи Для компактной пересылки разнородных данных можно использовать операции
упаковки и распаковки данных. Разнородные или расположенные не в последовательных ячейках памяти данные помещаются в один непрерывный буфер. Буфер пересылается, а потом полученное сообщение снова распределяется по нужным ячейкам памяти.
Для операций упаковки и распаковки используются функции MPI_Pack и MPI_Unpack.

Слайд 3

Н.Новгород, 2005 г.

Основы параллельных вычислений: Моделирование и анализ параллельных вычислений © Гергель

Н.Новгород, 2005 г. Основы параллельных вычислений: Моделирование и анализ параллельных вычислений ©
В.П.

из 51

Упаковка-распаковка данных для передачи Функция упаковки

int MPI_Pack ( void *data, int count, MPI_Datatype type,
void *buf, int buflen, int *bufpos, MPI_Comm comm),
где
- data – буфер памяти с элементами для упаковки,
- count – количество элементов в буфере,
- type – тип данных для упаковываемых элементов,
- buf - буфер памяти для упаковки,
- buflen – размер буфера в байтах,
- bufpos – позиция для начала записи в буфер (в байтах от начала буфера),
- comm - коммуникатор для упакованного сообщения.

Функция выполняет упаковку count элементов типа type из массива data в массив buf со сдвигом bufpos. После выполнения функции параметр bufpos увеличивается на число байт, равное размеру помещенных в буфер данных.

Слайд 4

Упаковка-распаковка данных для передачи Пересылка упакованных данных

Буфер для упаковки – buf [buflen] -

Упаковка-распаковка данных для передачи Пересылка упакованных данных Буфер для упаковки – buf
массив типа char размера buflen . Он должен быть больше суммарной длины всех данных для упаковки в байтах. Вместо переменной buflen можно использовать числовое значение.
Пересылка буфера с упакованными данными производится любой функцией передачи (индивидуальной или коллективной). Должен использоваться тип данных MPI_PACKED.

Слайд 5

int MPI_Unpack (void *buf, int buflen, int *bufpos,
void *data, int

int MPI_Unpack (void *buf, int buflen, int *bufpos, void *data, int count,
count, MPI_Datatype type, MPI_Comm comm);
где
- data – буфер памяти с элементами для распаковки,
- count – количество элементов в этом буфере,
- type – тип данных для распаковываемых элементов,
- buf - буфер памяти для распаковки,
- buflen – размер буфера в байтах,
- bufpos – позиция для начала записи в буфер (в байтах от начала буфера),
- comm - коммуникатор для упакованного сообщения.

Упаковка-распаковка данных для передачи Функция распаковки

Функция выполняет распаковку count элементов типа type из массива buf со сдвигом bufpos байт от начала массива в массив data. После выполнения функции параметр bufpos увеличивается на число байт, равное размеру считанных данных.

Слайд 6

Н.Новгород, 2005 г.

Основы параллельных вычислений: Моделирование и анализ параллельных вычислений © Гергель

Н.Новгород, 2005 г. Основы параллельных вычислений: Моделирование и анализ параллельных вычислений ©
В.П.

из 51

Упаковка-распаковка данных для передачи. Пояснение

Слайд 7

Н.Новгород, 2005 г.

Основы параллельных вычислений: Моделирование и анализ параллельных вычислений © Гергель

Н.Новгород, 2005 г. Основы параллельных вычислений: Моделирование и анализ параллельных вычислений ©
В.П.

из 51

Упаковка-распаковка данных для передачи

Формирование сообщений при помощи упаковки и распаковки данных…
Вызов функции MPI_Pack осуществляется последовательно для упаковки всех необходимых данных. Если в сообщение должны входить данные a,b,c, то для их упаковки необходимо выполнить:
Для распаковки упакованных данных необходимо выполнить:

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

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);

Слайд 8

char buf[100]; int pos;
float a; int n; int mas[6];
...
if (rank == 0){
printf("Enter a,

char buf[100]; int pos; float a; int n; int mas[6]; ... if
and n\n");
scanf("%f %i", &a, &n);
printf(“Enter 6 elements of array \n");
for(i=0;i<6;i++)
scanf("%i",&mas[i]);
/* упаковка a, n и массива mas из 6 элементов */
pos = 0;
MPI_Pack(&a, 1, MPI_FLOAT, &buf, 100, &pos, MPI_COMM_WORLD);
MPI_Pack(&n, 1, MPI_INT, &buf, 100, &pos, MPI_COMM_WORLD);
MPI_Pack(&mas, 6, MPI_INT, &buf, 100, &pos, MPI_COMM_WORLD);
MPI_Bcast(&buf, 100, MPI_PACKED, 0, MPI_COMM_WORLD);
} else {
MPI_Bcast(&buf, 100, MPI_PACKED, 0, MPI_COMM_WORLD);
pos = 0;
/* распаковка a, n и массива mas из 6 элементов */
MPI_Unpack(&buf, 100, &pos, &a, 1, MPI_FLOAT, MPI_COMM_WORLD);
MPI_Unpack(&buf, 100, &pos, &n, 1, MPI_INT, MPI_COMM_WORLD);
MPI_Unpack(&buf, 100, &pos, &mas, 6, MPI_INT, MPI_COMM_WORLD);
}

Пример формирования сообщений при помощи упаковки и распаковки данных