Exemplo n.º 1
0
/**
 * 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);
}
Exemplo n.º 2
0
/*----------------------------------------------------------------------------
 * 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 );
    }
}