如何在 cuda 中将 kd 树从主机复制到驱动程序
How to copy a kd-tree from host to driver in cuda
我有一个这样的 kd 树数据结构
class KDTree{
KDNode *root;
}
class KDNode{
std::vector<Triangle*> triangles;//if isLeaf then triangles.size()=0
AABB aabb;
KDNode *left,*right;
bool isLeaf;
}
class Triangle{
Point3D p1,p2,p3;
}
class AABB{
Point3D mins,maxs;
}
我可以在 CPU 中使用这个数据结构,现在我想将此树复制到 GPU(已在 CPU 上构建了树(。
我不确定如何实现这一目标。
你在这里有两个问题:
- 由于您(可能(单独和单独分配节点,因此您需要复制大量不应急的内存区域 - 这意味着要进行大量 CUDA API 调用。
- 即使您复制不同的节点 - 它们指向主机上的节点,而不是副本 - 因此您必须在任何地方更改指针。大量的时间和精力。
可能的解决方案:
- 改变树的表示形式,使节点都位于一个大的节点数组中(根据需要增长(;而不是指针,你在这个数组中使用索引。现在,您只需要复制一些根数据,以及这个(大(数组;以及更新设备端版本中的阵列地址。 使用 CUDA
- 的分配工具分配托管内存 - 可从 CUDA 设备 (GPU( 和主机使用相同的地址访问。这样,您就不必显式复制任何内容,并且可以使指针具有相同的值。当然,这会产生性能损失。
注意:树状结构在 CUDA 中使用效率非常低:通常,不同的线程会发散,并且大量时间都花在"指针追逐"上 - 使一个接一个的间接访问,另一个等等。因此,目前尚不清楚使用具有这种结构的GPU是否会获得很多好处(如果有的话(。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 库达如何将字符**从内核复制到主机
- 如何在 cuda 中将 kd 树从主机复制到驱动程序
- 如何在 cuda 中将结构的指针变量从主机复制到设备
- cudaMemcpy 在从设备复制到主机时抛出无效值错误
- 如何通过推力将主机矢量复制到设备矢量
- 在类成员函数更改设备变量的值后__device__从设备复制到主机时出现 cudaMemcpy 错误
- CUDA 设备主机复制非常慢
- 如何在Cuda中将2D阵列从设备复制到主机
- 如何将变量从主机上的自定义类数组复制到 CUDA 中设备上的浮点数组中
- 使用恒定内存将结构数组从主机复制到设备
- 如何将设备内存中分配的结构化数据从设备复制到主机
- CUDA:分配1d设备内存来将2d指针到指针主机数组复制到GPU
- 主机和设备缓冲区之间的复制