Альтернативный подход к группировке данных реализован функциями MPI_Pack() и MPI_Unpack(). MPI_Pack() позволяет явно хранить данные, состоящие из нескольких несмежных участков, в смежных областях памяти. MPI_Unpack() может использоваться для копирования данных из смежного буфера в области памяти, состоящие из нескольких несмежных участков.
Для иллюстрации этих функций можно привести еще один вариант текста функции Get_data():
int* n_ptr) {
int root = 0; /* Аргумент для MPI_Bcast */
char buffer[100]; /* Аргументы для MPI_Pack/Unpack */
int position; /* и MPI_Bcast*/
if (my_rank == 0) {
printf(''Введите a, b, и n\n'');
scanf(''%f %f %d'', a_ptr, b_ptr, n_ptr);
/* Упаковка данных в буфер */
position = 0; /* Начать с начала буфера */
MPI_Pack(a_ptr, 1, MPI_FLOAT, buffer, 100,
&position, MPI_COMM_WORLD);
/* Position будет увеличена на */
/* sizeof(float) байт */
MPI_Pack(b_ptr, 1, MPI_FLOAT, buffer, 100,
&position, MPI_COMM_WORLD);
MPI_Pack(n_ptr, 1, MPI_INT, buffer, 100,
&position, MPI_COMM_WORLD);
/* Разослать содержимое буфера */
MPI_Bcast(buffer, 100, MPI_PACKED, root,
MPI_COMM_WORLD);
} else {
MPI_Bcast(buffer, 100, MPI_PACKED, root,
MPI_COMM_WORLD);
/* Распаковать содержимое буфера */
position = 0;
MPI_Unpack(buffer, 100, &position, a_ptr, 1,
MPI_FLOAT, MPI_COMM_WORLD);
/* Позиция снова увеличивается на */
/* sizeof(float) байт */
MPI_Unpack(buffer, 100, &position, b_ptr, 1,
MPI_FLOAT, MPI_COMM_WORLD);
MPI_Unpack(buffer, 100, &position, n_ptr, 1,
MPI_INT, MPI_COMM_WORLD);
}
} /* Get-data4 */
Синтаксис вызова MPI_Pack():
MPI_Datatype datatype, void* buffer, int size,
int* position_ptr, MPI_Comm comm)
Синтаксис MPI_Unpack():
int* position_ptr, void* unpack_data,
int count, MPI_Datatype datatype,
MPI_comm comm);