next up previous contents
Next: Библиотечный пример 2 Up: Примеры Previous: Пример 4   Contents

Библиотечный пример 1

Головная программа:

main(int argc, char **argv) { int done = 0; user_lib_t *libh_a, *libh_b; void *dataset1, *dataset2; ... MPI_Init(&argc, &argv); ... init_user_lib(MPI_COMM_WORLD, &libh_a); init_user_lib(MPI_COMM_WORLD, &libh_b); ... user_start_op(libh_a, dataset1); user_start_op(libh_b, dataset2); ... while(!сделано) { /* выполнение */ ... MPI_Reduce(..., MPI_COMM_WORLD); ... /* проверка окончания цикла */ ... } user_end_op(libh_a); user_end_op(libh_b); uninit_user_lib(libh_a); uninit_user_lib(libh_b); MPI_Finalize(); }

Код инициализации библиотеки пользователя:

void init_user_lib(MPI_Comm comm, user_lib_t **handle) { user_lib_t *save; user_lib_initsave(&save); /* локально */ MPI_Comm_dup(comm, &(save->comm)); ... *handle = save; }

Пользовательский код запуска:

void user_start_op(user_lib_t *handle, void *data) { MPI_Irecv(..., handle->comm, &(handle->irecv_handle)); MPI_Isend(..., handle->comm, &(handle->isend_handle)); }

Пользовательский код очистки связи:

void user_end_op(user_lib_t *handle) { MPI_Status *status; MPI_Wait(handle -> isend_handle, status); MPI_Wait(handle -> irecv_handle, status); }

Код очистки обьекта пользователя:

void uninit_user_lib(user_lib_t *handle) { MPI_Comm_free(&(handle -> comm)); free(handle); }



Alex Otwagin 2002-12-10