正如评论中所建议的,访问是非法的
device_vector
在设备代码中。在撰写本文时可用的所有推力版本中,它们(尽管名称不同)都是主机端抽象。之所以会出现错误,是因为functor正在设备代码中调用device\u向量的复制构造,这需要构造新的容器,这将调用内存分配,并且无法编译。
你
应该
可以使用原始设备指针来实现这一点,例如:
struct plane_functor
{
Vec3* d_vec0;
Vec3* d_vec1;
__host__ __device__ plane_functor(Vec3* d_vec0, Vec3* d_vec1) : d_vec0(d_vec0), d_vec1(d_vec1) {}
__device__ int operator()(const Plane& pl) const {
return thrust::count_if(thrust::device, d_vec0, d_vec1, plane_distance(pl));
}
};
// ....
Vec3* d_vec0 = thrust::raw_pointer_cast(d_vec.data());
Vec3* d_vec1 = d_vec0 + (d_vec.end() - d_vec.begin());
thrust::transform(d_pl.begin(), d_pl.end(), counts.begin(), plane_functor( d_vec0, d_vec1 ) );
请注意,虽然这可以为我编译,但我无法运行您的代码,因为当我尝试运行时,主机端初始化lambda会崩溃。还要密切注意标记和基于策略的执行的混合。这个
thrust::transform
正如所写的,调用即使有有效的functor也会失败,因为
device\u向量
迭代器和
thrust::device
。