本人 CUDA小白一枚,要是有什么不对,还望各位大佬指点。
本文及后面的几篇将分别从几个方面来大概阐述一下Thrust的一些接口。原来的网址在这里。
1.Algorithms
1.8 Sorting
1.8.1 sort
template <typename DerivedPolicy, typename RandomAccessIterator>
__host__ __device__ void thrust::sort(
const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
RandomAccessIterator first,
RandomAccessIterator last
);
template <typename RandomAccessIterator>
void thrust::sort(
RandomAccessIterator first,
RandomAccessIterator last
);
template <typename DerivedPolicy, typename RandomAccessIterator, typename StrictWeakOrdering>
__host__ __device__ void thrust::sort(
const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
RandomAccessIterator first,
RandomAccessIterator last,
StrictWeakOrdering comp
);
template <typename RandomAccessIterator, typename StrictWeakOrdering>
void thrust::sort(
RandomAccessIterator first,
RandomAccessIterator last,
StrictWeakOrdering comp
);
排序,默认升序,可以指定排序方式comp。
例子:
const int N = 6;
int A[N] = {1, 4, 2, 8, 5, 7};
thrust::sort(thrust::host, A, A + N);
// thrust::sort(A, A + N);
// A {1, 2, 4, 5, 7, 8}
int B[N] = {1, 4, 2, 8, 5, 7};
thrust::sort(thrust::host, B, B + N, thrust::greater<int>());
// thrust::sort(B, B + N, thrust::greater<int>());
// B {8, 7, 5, 4, 2, 1};
1.8.2 stable_sort
template <typename DerivedPolicy,
typename RandomAccessIterator>
__host__ __device__ void
thrust::stable_sort(const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
RandomAccessIterator first,
RandomAccessIterator last);
template <typename RandomAccessIterator>
void
thrust::stable_sort(RandomAccessIterator first,
RandomAccessIterator last);
template <typename DerivedPolicy, typename RandomAccessIterator, typename StrictWeakOrdering>
__host__ __device__ void thrust::stable_sort(
const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
RandomAccessIterator first,
RandomAccessIterator last,
StrictWeakOrdering comp
);
template <typename RandomAccessIterator, typename StrictWeakOrdering>
void thrust::stable_sort(RandomAccessIterator first,
RandomAccessIterator last,
StrictWeakOrdering comp
);
相较于sort而言,针对相同的元素,可以保持原有的先后顺序。
例子:
const int N = 6;
int A[N] = {1, 4, 2, 8, 5, 7};
thrust::stable_sort(thrust::host, A, A + N);
// thrust::stable_sort(A, A + N);
// A {1, 2, 4, 5, 7, 8}
int B[N] = {1, 4, 2, 8, 5, 7};
thrust::stable_sort(thrust::host, B, BS + N, thrust::greater<int>());
// thrust::stable_sort( B, BS + N, thrust::greater<int>());
// B {8, 7, 5, 4, 2, 1};
1.8.3 sort_by_key
template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2>
__host__ __device__ void thrust::sort_by_key(
const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first
);
template <typename RandomAccessIterator1, typename RandomAccessIterator2>
void thrust::sort_by_key(
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first
);
template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering>
__host__ __device__ void thrust::sort_by_key(
const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first,
StrictWeakOrdering comp
);
template <typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering>
void thrust::sort_by_key(
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first,
StrictWeakOrdering comp
);
相较于sort而言,是针对key来排序,然后将对应的value按照排序之后的结果重新保存。同样可以指定排序方式。
例子:
const int N = 6;
int keys[N] = {1, 4, 2, 8, 5, 7};
char values[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::sort_by_key(thrust::host, keys, keys + N, values);
// thrust::sort_by_key(keys, keys + N, values);
// keys {1, 2, 4, 5, 7, 8}
// values {'a', 'c', 'b', 'e', 'f', 'd'}
int keys1[N] = { 1, 4, 2, 8, 5, 7};
char values1[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::sort_by_key(thrust::host, keys1, keys1 + N, values1, thrust::greater<int>());
// thrust::sort_by_key(keys1, keys1 + N, values1, thrust::greater<int>());
// keys1 {8, 7, 5, 4, 2, 1}
// values1 {'d', 'f', 'e', 'b', 'c', 'a'}
1.8.4 stable_sort_by_key
template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2>
__host__ __device__ void thrust::stable_sort_by_key(
const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first
);
template <typename RandomAccessIterator1, typename RandomAccessIterator2>
void thrust::stable_sort_by_key(
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first
);
template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering>
__host__ __device__ void thrust::stable_sort_by_key(
const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first,
StrictWeakOrdering comp
);
template <typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering>
void thrust::stable_sort_by_key(
RandomAccessIterator1 keys_first,
RandomAccessIterator1 keys_last,
RandomAccessIterator2 values_first,
StrictWeakOrdering comp
);
相较于stable_sort,这边的排序是根据的key来排序,同时对应的value也会同步变动。可指定排序方式。
const int N = 6;
int keys[N] = {1, 4, 2, 8, 5, 7};
char values[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::stable_sort_by_key(thrust::host, keys, keys + N, values);
// thrust::stable_sort_by_key(keys, keys + N, values);
// keys {1, 2, 4, 5, 7, 8}
// values {'a', 'c', 'b', 'e', 'f', 'd'}
int keys1[N] = { 1, 4, 2, 8, 5, 7};
char values1[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::stable_sort_by_key(thrust:host, keys1, keys1 + N, values1, thrust::greater<int>());
// thrust::stable_sort_by_key(keys1, keys1 + N, values1, thrust::greater<int>());
// keys1 {8, 7, 5, 4, 2, 1}
// values1 {'d', 'f', 'e', 'b', 'c', 'a'}