将 Thrust Zip 迭代器与设备函子一起使用时出错

Error using Thrust Zip iterator with device functor

我在使用 Cuda 和 Thrust 的 Linux 环境中工作 我有一个标准代码,我需要对其进行转换因此,我第一次尝试使用 zip_iterator,但遇到了一些问题。

错误:无法使用给定的参数列表调用函数“gridTransform::operator()”

有人知道如何解决这个问题吗。 谢谢

thrust::host_vector<float> X_h;
thrust::host_vector<float> Y_h;
thrust::host_vector<float> Z_h;


typedef thrust::tuple<float,float,float>                           Float3;

typedef thrust::device_vector<float>::iterator                     FloatIterator;
typedef thrust::tuple<FloatIterator, FloatIterator, FloatIterator> FloatIteratorTuple;
typedef thrust::zip_iterator<FloatIteratorTuple>                  Float3Iterator;

struct gridTransform 
{
    float k;
    gridTransform(float _k)
    {
        k=_k;
    }
    __host__ __device__ Float3 operator()(Float3 &p1) const
    {
        float lx1=roundf(thrust::get<0>(p1)/k);
        float ly1=roundf(thrust::get<1>(p1)/k);
        float lz1=roundf(thrust::get<2>(p1)/k);

        return Float3(lx1,ly1,lz1);
    }
};

void Gpu_Functions::Decimation()
{
    thrust::device_vector<float> X_d(X_h);
    thrust::device_vector<float> Y_d(Y_h);
    thrust::device_vector<float> Z_d(Z_h);


    // Storage for result of each transformations
    thrust::device_vector<Float3> result(N);
    // Now we'll create some zip_iterators for A and B
    Float3Iterator A_first = thrust::make_zip_iterator(make_tuple(X_d.begin(), Y_d.begin(), Z_d.begin()));
    Float3Iterator A_last = thrust::make_zip_iterator(make_tuple(X_d.begin(), Y_d.begin(), Z_d.begin()));
   
    // vertices transformation generate duplicate vertices
    thrust::transform(A_first, A_last, result.begin(), gridTransform(0.01)); 

   // sort vertices to bring duplicates together
    thrust::sort(result.begin(), result.end());

    // find unique vertices and erase redundancies
   result.erase(thrust::unique(result.begin(), result.end()), result.end());
   
}

gridTransform::operator()需要拿一个const Float3 &。我猜 Thrust 没有实现从其内部 thrust::detail::tuple_of_iterator_references<float &, float &, float &> 到非常量元组的转换。

做出此设计决定的原因可能是对于非常量引用,行为会有些出乎意料:向此元组写入内容可能不会导致设备内存中的输入向量发生变化,而只会导致寄存器中的一些临时元组。