我有一个Athens-RELEASE
,其中有一个struct Cap
的另一个结构。当我编译代码时,我收到一个错误,它抱怨从设备函数thrust::device_vector
调用主机函数(thrust::device_vector<FloatIntPair>
)。当我向成员函数和构造函数添加SphericalFaceManager::makeCaps
而不仅仅__host__ __device__
时,代码然后编译但是我收到与上述错误相同的警告,我认为它在主机和设备之间复制数据。我的问题是如何在我的类中访问设备向量,避免CPU和GPU之间的任何数据传输?
此后您可以找到代码:
__device__
答案 0 :(得分:2)
您不能直接在设备代码中使用推力矢量(或std::vector
)。在诸如here
如果要在设备代码中使用thrust::device_vector
中的数据,则应将指向数据的指针作为仿函数初始化参数传递。各种其他SO问题举例说明了这一点,例如here
同样,你不能使用矢量方法,例如设备代码中的.empty()
或.push_back()
。
您需要将这些替换为普通的C风格分配器和C风格的索引数据访问。
对于设备代码中的push_back的多线程实现,我建议像this这样的东西。这是一个完整的示例,演示了如何为向量分配空间以及每个线程如何将其用于insertVertex
。