我正在尝试传递device_vector
个结构
struct point
{
unsigned int x;
unsigned int y;
}
以下列方式处理函数:
void print(thrust::device_vector<point> &points, unsigned int index)
{
std::cout << points[index].y << points[index].y << std::endl;
}
myvector已正确初始化
print(myvector, 0);
我收到以下错误:
error: class "thrust::device_reference<point>" has no member "x"
error: class "thrust::device_reference<point>" has no member "y"
它出了什么问题?
答案 0 :(得分:5)
不幸的是,device_reference<T>
无法公开T
的成员,但可以转换为T
。
要实施print
,请将每个元素的临时副本转换为临时temp
:
void print(thrust::device_vector<point> &points, unsigned int index)
{
point temp = points[index];
std::cout << temp.y << temp.y << std::endl;
}
每次调用print
时,都会导致从GPU转移到系统内存以创建临时内容。如果您需要同时打印整个points
集合,则更有效的方法会将整个向量points
整体复制到host_vector
或std::vector
(使用{{ 1}})然后正常迭代集合。
答案 1 :(得分:1)
来自http://thrust.googlecode.com/svn/tags/1.1.0/doc/html/structthrust_1_1device__reference.html:
device_reference充当对存储在设备存储器中的对象的引用。 device_reference不能直接使用;相反,这种类型是引用device_ptr的结果。同样,获取device_reference的地址会产生device_ptr。
也许你需要像
这样的东西(&points[index]).get()->x
而不是
points[index].x
这有点难看,但CUDA需要一种机制来在RAM和GPU之间传输数据。