将 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 &>
到非常量元组的转换。
做出此设计决定的原因可能是对于非常量引用,行为会有些出乎意料:向此元组写入内容可能不会导致设备内存中的输入向量发生变化,而只会导致寄存器中的一些临时元组。
我在使用 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 &>
到非常量元组的转换。
做出此设计决定的原因可能是对于非常量引用,行为会有些出乎意料:向此元组写入内容可能不会导致设备内存中的输入向量发生变化,而只会导致寄存器中的一些临时元组。