本人 CUDA小白一枚,要是有什么不对,还望各位大佬指点。
本文及后面的几篇将分别从几个方面来大概阐述一下Thrust的一些接口。原来的网址在这里。
1.Algorithms
1.2 Merging
1.2.1 mege
template<typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator>
__host__ __device__ OutputIterator thrust::merge(
const thrust::detail::execution_policy_base< DerviedPolicy > &exec,
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator1 last2,
OutputIterator result
);
template<typename InputIterator1, typename InputIterator2, typename OutputIterator>
OutputIterator thrust::merge(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator1 last2,
OutputIterator result
);
template<typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare>
__host__ __device__ OutputIterator thrust::merge(
const thrust::detail::execution_policy_base< DerviedPolicy > &exec,
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator1 last2,
OutputIterator result,
StrictWeakCompare comp
);
template<typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare>
OutputIterator thrust::merge(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator1 last2,
OutputIterator result,
StrictWeakCompare comp
);
将两组有序的数据合并成一个有序的数据。merge的过程是较为稳定的,并且如果出现相同的元素,第一个中的优先级较高。
例子:
int A1[6] = {1, 3, 5, 7, 9, 11};
int A2[7] = {1, 1, 2, 3, 5, 8, 13};
int result[13];
int *result_end = thrust::merge(thrust::host, A1, A1 + 6, A2, A2 + 7, result);
int *result_end = thrust::merge( A1, A1 + 6, A2, A2 + 7, result);
// result {1, 1, 1, 2, 3, 3, 5, 5, 7, 8, 9, 11, 13}
1.2.2 merge_by_key
template<typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2>
__host__ __device__ thrust::pair<OutputIterator1, OutputIterator2> thrust::merge_by_key(
const thrust::detail::execution_policy_base< DerviedPolicy > &exec,
InputIterator1 keys_first1,
InputIterator1 keys_last1,
InputIterator2 keys_first1,
InputIterator2 keys_last1,
InputIterator3 values_first1,
InputIterator4 values_first2,
OutputIterator1 keys_result,
OutputIterator2 valuse_result
);
template<typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2>
thrust::pair<OutputIterator1, OutputIterator2> thrust::merge_by_key(
InputIterator1 keys_first1,
InputIterator1 keys_last1,
InputIterator2 keys_first1,
InputIterator2 keys_last1,
InputIterator3 values_first1,
InputIterator4 values_first2,
OutputIterator1 keys_result,
OutputIterator2 valuse_result
);
template<typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename Compare>
__host__ __device__ thrust::pair<OutputIterator1, OutputIterator2> thrust::merge_by_key(
const thrust::detail::execution_policy_base< DerviedPolicy > &exec,
InputIterator1 keys_first1,
InputIterator1 keys_last1,
InputIterator2 keys_first1,
InputIterator2 keys_last1,
InputIterator3 values_first1,
InputIterator4 values_first2,
OutputIterator1 keys_result,
OutputIterator2 valuse_result,
Compare comp
);
template<typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename Compare>
thrust::pair<OutputIterator1, OutputIterator2> thrust::merge_by_key(
InputIterator1 keys_first1,
InputIterator1 keys_last1,
InputIterator2 keys_first1,
InputIterator2 keys_last1,
InputIterator3 values_first1,
InputIterator4 values_first2,
OutputIterator1 keys_result,
OutputIterator2 valuse_result,
Compare comp
);
按照按照key的值进行merge,主要是根据keys的顺序进行merge,values的结果是对应keys中每一位的结果。同样的,如果遇到相同的大小,第一个中的key优先级会大于第二个的。
int A_keys[6] = {1, 3, 5, 7, 9, 11};
int A_vals[6] = {1, 3, 5, 7, 9, 11};
int B_keys[7] = {1, 1, 2, 3, 5, 8, 13};
int B_vals[7] = {0, 2, 4, 6, 8, 10, 12};
int keys[13];
int vals[13];
thrust::pair<int*, int*> end = thrust::merge_by_key(thrust::host, A_keys, A_keys + 6, B_keys, B_keys + 7, A_vals, B_vals, keys, vals);
// thrust::pair<int*, int*> end = thrust::merge_by_key(A_keys, A_keys + 6, B_keys, B_keys + 7, A_vals, B_vals, keys, vals);
// 最终结果 keys {1, 1, 1, 2, 3, 3, 5, 5, 7, 8, 9, 11, 13}
// 最终结果 vals {1, 0 ,2, 4, 3, 6, 5, 8, 7 ,10, 9 11, 12}
// 指定com,由于使用的是greater(x > y的话,会返回true,反之会返回false)
int A_Keys1[6] = {11, 9, 7, 5, 3, 1};
int B_keys1[7] = {13, 8, 5, 3, 2, 1, 1};
thrust::pair<int*, int*> end = thrust::merge_by_key(thrust::host, A_Keys1, A_Keys1 + 6, B_keys1, B_keys1 + 7, A_vals, B_vals, keys, vals, thrust::greater<int>());
// 最终结果 keys {13, 11, 9, 8, 7, 5, 5, 3, 3, 2, 1, 1}
// 最终结果 vals {0, 1, 3, 2, 5, 7, 4, 9, 6, 8, 11, 10, 12}