推力收集/过滤

时间:2013-11-19 12:21:20

标签: cuda thrust

我要做的是在向量上创建一个过滤器,以便删除不通过谓词测试的元素;但我不太清楚我是怎么做的。

我根据谓词评估我的inputer向量中的每个元素,例如在我的代码中,在device_vector向量中的is_even仿函数。如果通过测试则确实如此,如果不通过则为假。

现在我被困了,因为我现在有了这个bool向量,我想收集通过这个谓词测试的元素。我将它存储在bool向量中,因为我想保留结果以过滤其他向量。

#include ...

template<typename T>
struct is_even : thrust::unary_function<T, bool>
{
    __host__ __device__
    bool operator()(const T &x)
    {
        return (x%2)==0;
    }
};

int main(void)
{
    std::cout << "Loading test!" << std::endl;
    const int N = 1000000;
    thrust::device_vector<int> col1(N);
    thrust::device_vector<float> col2(N, 1); 
    thrust::sequence(col1.begin(), col1.end());

    thrust::device_vector<bool> filter(N);
    thrust::transform(col1.begin(), col1.end(), filter.begin(), is_even<int>());

    // filter col1 and col2 based on filter

    return 0;
}

1 个答案:

答案 0 :(得分:5)

在您可能感兴趣thrust::copy_if

stream compaction group

我们可以直接使用您定义的谓词将偶数元素选择到新的向量中,而无需创建中间filter向量:

thrust::copy_if(col1.begin(), col1.end(), result.begin(), is_even<int>());

result应该是与col1相同类型的向量,并且已经定义为等于或大于col1的长度,因为未知有多少元素将通过谓词测试。)

如果您想使用自己创建的filter向量,请使用copy_if代替$ cat t267.cu #include <iostream> #include <thrust/device_vector.h> #include <thrust/sequence.h> #include <thrust/transform.h> #include <thrust/copy.h> template<typename T> struct is_even : thrust::unary_function<T, bool> { __host__ __device__ bool operator()(const T &x) { return (x%2)==0; } }; struct is_true : thrust::unary_function<bool, bool> { __host__ __device__ bool operator()(const bool &x) { return x; } }; int main(void) { std::cout << "Loading test!" << std::endl; const int N = 1000000; thrust::device_vector<int> col1(N); thrust::device_vector<float> col2(N, 1); thrust::sequence(col1.begin(), col1.end()); thrust::device_vector<bool> filter(N); thrust::device_vector<int> result(N); thrust::transform(col1.begin(), col1.end(), filter.begin(), is_even<int>()); // filter col1 based on filter thrust::device_vector<int>::iterator end = thrust::copy_if(col1.begin(), col1.end(), filter.begin(), result.begin(), is_true()); int len = end - result.begin(); thrust::host_vector<int> h_result(len); thrust::copy_n(result.begin(), len, h_result.begin()); thrust::copy_n(h_result.begin(), 10, std::ostream_iterator<int>(std::cout, "\n")); return 0; } $ nvcc -arch=sm_20 -o t267 t267.cu $ ./t267 Loading test! 0 2 4 6 8 10 12 14 16 18 $

以下是基于您的评论使用模板方法的实例:

{{1}}