如何在 cuda 中将 kd 树从主机复制到驱动程序

How to copy a kd-tree from host to driver in cuda

本文关键字:主机 复制 驱动程序 kd cuda 中将      更新时间:2023-10-16

我有一个这样的 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 上构建了树(。

我不确定如何实现这一目标。

你在这里有两个问题:

  1. 由于您(可能(单独和单独分配节点,因此您需要复制大量不应急的内存区域 - 这意味着要进行大量 CUDA API 调用。
  2. 即使您复制不同的节点 - 它们指向主机上的节点,而不是副本 - 因此您必须在任何地方更改指针。大量的时间和精力。

可能的解决方案:

  1. 改变树的表示形式,使节点都位于一个大的节点数组中(根据需要增长(;而不是指针,你在这个数组中使用索引。现在,您只需要复制一些根数据,以及这个(大(数组;以及更新设备端版本中的阵列地址。
  2. 使用 CUDA
  3. 的分配工具分配托管内存 - 可从 CUDA 设备 (GPU( 和主机使用相同的地址访问。这样,您就不必显式复制任何内容,并且可以使指针具有相同的值。当然,这会产生性能损失。

注意:树状结构在 CUDA 中使用效率非常低:通常,不同的线程会发散,并且大量时间都花在"指针追逐"上 - 使一个接一个的间接访问,另一个等等。因此,目前尚不清楚使用具有这种结构的GPU是否会获得很多好处(如果有的话(。