我有一个节点树,我想复制到GPU memroy。 Node看起来像这样:
struct Node
{
char *NodeName;
int NumberOfChildren;
Node *Children;
Node *Parent;
}
每个节点都有一个动态数量的子节点但只有一个父节点。如何将此树复制到CUDA全局内存?我应该通过树BFS并分配/复制数据到GPU吗?或者我可以使用单个cuda内存复制指令吗?
答案 0 :(得分:5)
我不确定您的数据来源,但是,您可以使用平面内存空间并使用索引偏移量作为访问内存的索引。
即
节点定义为:
struct Node
{
unsigned int name;
unsigned int number_of_children;
unsigned int parent;
unsigned int children;
}
你可以使用一块大内存来构建你的树。 (保留插入项目的最后一个位置的记忆计数器。)
您也可以添加字符串。
这样你会有一个连续的内存块,它将是一个简单的内存副本。访问简单演员的项目将起作用。
意味着重写树和字符串代码,但会保持一致。如果你不知道你的内存有多大,你可以这样做就是页面并将引用更改为一对int将使分配内存更容易。
彼得。
PS:嵌入式工程师不是CUDA程序员,但遇到过类似的问题,无需进行解析就可以跨处理器移动树。答案 1 :(得分:1)
通常,您希望使用单个内存副本,因为多个小副本会破坏性能。可能正确的做法是跟踪插入树时所需的总大小(或走树计算它),分配(或更大)数量,然后进行单个数据传输。如果您以后需要复制比分配的更大的树,请释放该内存并分配新块。
不幸的是,所有指针在gpu上都是无效的,所以你可以将结构扩展为:
struct Node { char *NodeName; int NumberOfChildren; Node *Children; /* children on host */ Node *Parent; /* parent on host */ Node *d_children; /* children on device */ Node *d_parent; /* parent on device */ }
然后在分配后遍历树,分配给新节点。
就性能而言,您肯定希望避免多次小数据传输。