如何知道 thrust::partition_copy 的结果中有多少个元素
How to know how many elements are in the result of thrust::partition_copy
我正在尝试使用 thrust 库的 partition_copy 函数对数组进行分区。
我看过传递指针的例子,但我需要知道每个分区中有多少个元素。
我尝试过将设备向量作为 OutputIterator 参数传递,如下所示:
#include <thrust/device_vector.h>
#include <thrust/device_ptr.h>
#include <thrust/partition.h>
struct is_even {
__host__ __device__ bool operator()(const int &x) {
return (x % 2) == 0;
}
};
int N;
int *d_data;
cudaMalloc(&d_data, N*sizeof(int));
//... Some data is put in the d_data array
thrust::device_ptr<int> dptr_data(d_data);
thrust::device_vector<int> out_true(N);
thrust::device_vector<int> out_false(N);
thrust::partition_copy(dptr_data, dptr_data + N, out_true, out_false, is_even());
当我尝试编译时出现此错误:
error: class "thrust::iterator_system<thrust::device_vector<int, thrust::device_allocator<int>>>" has no member "type"
detected during instantiation of "thrust::pair<OutputIterator1, OutputIterator2> thrust::partition_copy(InputIterator, InputIterator, OutputIterator1, OutputIterator2, Predicate) [with InputIterator=thrust::device_ptr<int>, OutputIterator1=thrust::device_vector<int, thrust::device_allocator<int>>, OutputIterator2=thrust::device_vector<int, thrust::device_allocator<int>>, Predicate=leq]"
所以我的问题是:如何使用 thrust::partition 或 thrust::partition_copy 并知道每个分区中最终有多少个元素?
您的编译错误是由于您在这里传递的是向量而不是迭代器:
thrust::partition_copy(dptr_data, dptr_data + N, out_true, out_false, is_even());
^^^^^^^^^^^^^^^^^^^
相反,您应该传递基于这些容器的迭代器:
thrust::partition_copy(dptr_data, dptr_data + N, out_true.begin(), out_false.begin(), is_even());
为了得到结果的长度,我们必须使用return value of thrust::partition copy():
Returns
A pair p such that p.first is the end of the output range beginning at out_true and p.second is the end of the output range beginning at out_false.
像这样:
auto r = thrust::partition_copy(dptr_data, dptr_data + N, out_true.begin(), out_false.begin(), is_even());
int length_true = r.first - out_true.begin();
int length_false = r.second - out_false.begin();
请注意,类似的方法可用于其他推力算法。那些没有 return 元组的将更容易使用。
例如:
auto length = (thrust::remove_if(A.begin(), A.end(), ...) - A.begin());
我正在尝试使用 thrust 库的 partition_copy 函数对数组进行分区。
我看过传递指针的例子,但我需要知道每个分区中有多少个元素。
我尝试过将设备向量作为 OutputIterator 参数传递,如下所示:
#include <thrust/device_vector.h>
#include <thrust/device_ptr.h>
#include <thrust/partition.h>
struct is_even {
__host__ __device__ bool operator()(const int &x) {
return (x % 2) == 0;
}
};
int N;
int *d_data;
cudaMalloc(&d_data, N*sizeof(int));
//... Some data is put in the d_data array
thrust::device_ptr<int> dptr_data(d_data);
thrust::device_vector<int> out_true(N);
thrust::device_vector<int> out_false(N);
thrust::partition_copy(dptr_data, dptr_data + N, out_true, out_false, is_even());
当我尝试编译时出现此错误:
error: class "thrust::iterator_system<thrust::device_vector<int, thrust::device_allocator<int>>>" has no member "type"
detected during instantiation of "thrust::pair<OutputIterator1, OutputIterator2> thrust::partition_copy(InputIterator, InputIterator, OutputIterator1, OutputIterator2, Predicate) [with InputIterator=thrust::device_ptr<int>, OutputIterator1=thrust::device_vector<int, thrust::device_allocator<int>>, OutputIterator2=thrust::device_vector<int, thrust::device_allocator<int>>, Predicate=leq]"
所以我的问题是:如何使用 thrust::partition 或 thrust::partition_copy 并知道每个分区中最终有多少个元素?
您的编译错误是由于您在这里传递的是向量而不是迭代器:
thrust::partition_copy(dptr_data, dptr_data + N, out_true, out_false, is_even());
^^^^^^^^^^^^^^^^^^^
相反,您应该传递基于这些容器的迭代器:
thrust::partition_copy(dptr_data, dptr_data + N, out_true.begin(), out_false.begin(), is_even());
为了得到结果的长度,我们必须使用return value of thrust::partition copy():
Returns A pair p such that p.first is the end of the output range beginning at out_true and p.second is the end of the output range beginning at out_false.
像这样:
auto r = thrust::partition_copy(dptr_data, dptr_data + N, out_true.begin(), out_false.begin(), is_even());
int length_true = r.first - out_true.begin();
int length_false = r.second - out_false.begin();
请注意,类似的方法可用于其他推力算法。那些没有 return 元组的将更容易使用。
例如:
auto length = (thrust::remove_if(A.begin(), A.end(), ...) - A.begin());