コード例 #1
0
ファイル: p4graded-tcsiwula.c プロジェクト: tcsiwula/c_code
/* ============================================================================
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 */
コード例 #2
0
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 */