CUDA推力:选择性复制和调整大小结果

Luc*_*uca 0 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();
Run Code Online (Sandbox Code Playgroud)

is_valid_pt实现为:

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

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

Rob*_*lla 5

推力不会在任何算法调用中调整向量的大小。进入推力算法的向量的大小将恰好是从算法中出来的向量的大小。

rinkle_to_fit对向量的大小也没有影响,但可能会影响容量,这与分配有关。

如果要将大小减小collated到实际复制到其中的元素数量,则需要使用函数的返回值copy_if来计算其大小,然后进行调整大小。

像这样:

size_t my_size = thrust::copy_if(original_vec.begin(), original_vec.end(), collated.begin(), is_valid_pt()) - collated.begin();
collated.resize(my_size);
Run Code Online (Sandbox Code Playgroud)

  • 是。向右滚动代码框。我减去`collat​​ed.begin()`产生一个大小。我没有说返回值*是*大小,而是说使用返回值来计算大小。 (2认同)