/* ============================================================================ Function: = Bitonic_sort_decr Purpose: = Use bitonic sort to sort the keys in my_list into = decreasing order. ============================================================================== Input arg: = 1. my_rank: The size of the processors array. = 2. my_list[]: A pointer to an array. = 3. neighbors_list[]: A pointer to an array. = 4. list_size: The size of the processors array. = 5. partner_size: The size of partner pairing. = 6. comm: The mpi communicator channel. ============================================================================== Note: = len is a power of 2 =========================================================================== */ void Bitonic_sort_decr(int my_rank, int my_list[], int neighbors_list[], int list_size, int partner_size, MPI_Comm comm) { unsigned xor_bit; int partner, stage, stage_limit; stage_limit = log_base2(partner_size); xor_bit = 1 << (stage_limit - 1); for(stage = 0; stage < stage_limit; stage++) { partner = my_rank ^ xor_bit; if(my_rank > partner) { Merge_split(1, my_rank, list_size, my_list, neighbors_list, partner, comm); } else { Merge_split(0, my_rank, list_size, my_list, neighbors_list, partner, comm); } xor_bit = xor_bit >> 1; } } /* Bitonic_sort_decr */
void Par_bitonic_sort_decr( int list_size /* in */, KEY_T* local_list /* in/out */, int proc_set_size /* in */, MPI_Comm comm /* in */ ) { unsigned eor_bit; int proc_set_dim; int stage; int partner; int my_rank; MPI_Comm_rank(comm, &my_rank); proc_set_dim = log_base2(proc_set_size); eor_bit = 1 << (proc_set_dim - 1); for (stage = 0; stage < proc_set_dim; stage++) { partner = my_rank ^ eor_bit; if (my_rank > partner) Merge_split(list_size, local_list, LOW, partner, comm); else Merge_split(list_size, local_list, HIGH, partner, comm); eor_bit = eor_bit >> 1; } } /* Par_bitonic_sort_decr */