通过引用将thrust :: device_vector传递给函数

时间:2011-07-08 11:54:32

标签: c++ cuda gpu thrust

我正在尝试传递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"

它出了什么问题?

2 个答案:

答案 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_vectorstd::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之间传输数据。