CUDA初学者-Thrust - Algorithms - Merging(2)

本人 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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值