/** * MPI prijem zasobniku a spojeni s lokalnim zasobnikem. */ void mpi_recv_stack(const int src) { assert(t); assert(s); MPI_Status mpi_status; unsigned int l; char *b = NULL; MPI_Recv(&l, 1, MPI_UNSIGNED, src, MSG_STACK, MPI_COMM_WORLD, &mpi_status); srpdebug("mpi", node, "prijeti zasobnik <l=%db, src=%d>", l, mpi_status.MPI_SOURCE); // naalokuju buffer a zahajim blokujici cekani na MSG_STACK_DATA srpdebug("mpi", node, "cekani na zpravu <delka=%db>", l); MPI_Probe(src, MSG_STACK_DATA, MPI_COMM_WORLD, &mpi_status); b = (char *)utils_malloc(l * sizeof(char)); MPI_Recv(b, l, MPI_PACKED, src, MSG_STACK_DATA, MPI_COMM_WORLD, &mpi_status); stack_t *sn = stack_mpiunpack(b, t, l); free(b); srpdebug("mpi", node, "prijeti zasobnik <s=%d>", sn->s); // sloucit zasobniky stack_merge(s, sn); }
/*---------------------------------------------------------------------------- * Method: SRT_poly_mergesort *---------------------------------------------------------------------------*/ void SRT_poly_mergesort( void **array, size_t num_elements, SRT_CMP_PROC_p_t cmp_proc ) { if( stack == STK_NULL_ID ) stack = STK_create_stack( MAX_STACK_SIZE ); if(num_elements > 1) { size_t low = num_elements / 2; size_t high = num_elements - (int)low; void** array2 = array + (int)low; SRT_poly_mergesort( array, (int)low, cmp_proc ); SRT_poly_mergesort( array2, (int)high, cmp_proc ); stack_merge( array, (int)low, array2, (int)high, stack, cmp_proc ); } }