Spaces:
Runtime error
Runtime error
| // This example shows how to perform a lexicographical sort on multiple keys. | |
| // | |
| // http://en.wikipedia.org/wiki/Lexicographical_order | |
| template <typename KeyVector, typename PermutationVector> | |
| void update_permutation(KeyVector& keys, PermutationVector& permutation) | |
| { | |
| // temporary storage for keys | |
| KeyVector temp(keys.size()); | |
| // permute the keys with the current reordering | |
| thrust::gather(permutation.begin(), permutation.end(), keys.begin(), temp.begin()); | |
| // stable_sort the permuted keys and update the permutation | |
| thrust::stable_sort_by_key(temp.begin(), temp.end(), permutation.begin()); | |
| } | |
| template <typename KeyVector, typename PermutationVector> | |
| void apply_permutation(KeyVector& keys, PermutationVector& permutation) | |
| { | |
| // copy keys to temporary vector | |
| KeyVector temp(keys.begin(), keys.end()); | |
| // permute the keys | |
| thrust::gather(permutation.begin(), permutation.end(), temp.begin(), keys.begin()); | |
| } | |
| thrust::host_vector<int> random_vector(size_t N) | |
| { | |
| thrust::host_vector<int> vec(N); | |
| static thrust::default_random_engine rng; | |
| static thrust::uniform_int_distribution<int> dist(0, 9); | |
| for (size_t i = 0; i < N; i++) | |
| vec[i] = dist(rng); | |
| return vec; | |
| } | |
| int main(void) | |
| { | |
| size_t N = 20; | |
| // generate three arrays of random values | |
| thrust::device_vector<int> upper = random_vector(N); | |
| thrust::device_vector<int> middle = random_vector(N); | |
| thrust::device_vector<int> lower = random_vector(N); | |
| std::cout << "Unsorted Keys" << std::endl; | |
| for(size_t i = 0; i < N; i++) | |
| { | |
| std::cout << "(" << upper[i] << "," << middle[i] << "," << lower[i] << ")" << std::endl; | |
| } | |
| // initialize permutation to [0, 1, 2, ... ,N-1] | |
| thrust::device_vector<int> permutation(N); | |
| thrust::sequence(permutation.begin(), permutation.end()); | |
| // sort from least significant key to most significant keys | |
| update_permutation(lower, permutation); | |
| update_permutation(middle, permutation); | |
| update_permutation(upper, permutation); | |
| // Note: keys have not been modified | |
| // Note: permutation now maps unsorted keys to sorted order | |
| // permute the key arrays by the final permuation | |
| apply_permutation(lower, permutation); | |
| apply_permutation(middle, permutation); | |
| apply_permutation(upper, permutation); | |
| std::cout << "Sorted Keys" << std::endl; | |
| for(size_t i = 0; i < N; i++) | |
| { | |
| std::cout << "(" << upper[i] << "," << middle[i] << "," << lower[i] << ")" << std::endl; | |
| } | |
| return 0; | |
| } | |