packages feed

cuda-0.1: examples/src/sort/radix_sort.cu

/* -----------------------------------------------------------------------------
 *
 * Module    : Sort
 * Copyright : (c) 2009 Trevor L. McDonell
 * License   : BSD
 *
 *----------------------------------------------------------------------------*/

#include <cudpp.h>

#include "sort.h"


template <typename T> CUDPPDatatype static getType();
template <> CUDPPDatatype getType<float>()        { return CUDPP_FLOAT; }
template <> CUDPPDatatype getType<unsigned int>() { return CUDPP_UINT;  }


/*
 * In-place radix sort of values or key-value pairs. Values can be any 32-bit
 * type, as their payload is never inspected or manipulated.
 */
template <typename T>
static void
radix_sort
(
    unsigned int        length,
    T                   *d_keys,
    void                *d_vals = NULL,
    int                 bits    = 8 * sizeof(T)
)
{
    CUDPPHandle         plan;
    CUDPPConfiguration  cp;

    cp.datatype  = getType<T>();
    cp.algorithm = CUDPP_SORT_RADIX;
    cp.options   = (d_vals != NULL) ? CUDPP_OPTION_KEY_VALUE_PAIRS
                                    : CUDPP_OPTION_KEYS_ONLY;

    cudppPlan(&plan, cp, length, 1, 0);
    cudppSort(plan, d_keys, d_vals, bits, length);

    cudppDestroyPlan(plan);
}


/* -----------------------------------------------------------------------------
 * Instances
 * ---------------------------------------------------------------------------*/

void sort_f(float *d_keys, void *d_vals, unsigned int length)
{
    radix_sort<float>(length, d_keys, d_vals);
}

void sort_ui(unsigned int *d_keys, void *d_vals, unsigned int length)
{
    radix_sort<unsigned int>(length, d_keys, d_vals);
}