cuda推力:选择性复制和调整结果

时间:2015-05-31 19:35:37

标签: cuda thrust

我使用copy_if选择性地在两个推力装置阵列之间复制项目,如下所示:

thrust::device_vector<float4> collated = thrust::device_vector<float4> 
                       original_vec.size());
thrust::copy_if(original_vec.begin(), original_vec.end(),
                collated.begin(), is_valid_pt());
collated.shrink_to_fit();

is_valid_pt实现为:

struct is_valid_kpt
{
    __host__ __device__ bool operator()(const float4 x)
    {
        return x.w >= 0;
    }
}; 

现在运行此代码后,我希望collated向量的大小远小于原始数组,但它们的大小仍然相同。

1 个答案:

答案 0 :(得分:5)

作为任何算法调用的一部分,Thrust不会调整向量的大小。进入推力算法的向量大小将与算法中出现的向量大小完全相同。

shrink_to_fit对矢量的尺寸也没有影响,但它可能会影响容量,这与分配有关。

如果要将collated的大小减少到复制到其中的元素的实际数量,则需要使用the return value of the copy_if function来计算其大小,然后执行调整大小。

这样的事情:

size_t my_size = thrust::copy_if(original_vec.begin(), original_vec.end(), collated.begin(), is_valid_pt()) - collated.begin();
collated.resize(my_size);