将树复制到GPU内存
问题描述:
我有一个节点树,我想复制到GPU memroy。该节点看起来像这样:将树复制到GPU内存
struct Node
{
char *NodeName;
int NumberOfChildren;
Node *Children;
Node *Parent;
}
每个节点都有一个动态数量的子节点,但有一个父节点。我如何将这棵树复制到CUDA全局内存?我应该通过树BFS分配/复制数据到GPU?或者我可以使用单个cuda内存复制指令吗?
答
一般而言,您希望使用单个内存副本,因为多个小副本会导致性能下降。可能正确的做法是跟踪插入树中所需的总大小(或漫游树计算它),分配(或更大)数量,然后执行单个数据传输。如果您以后需要复制大于分配的树,请释放该内存并分配新的块。
不幸的是,所有的指针将在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 */ }
,然后分配后,在树内,分配给新节点。
就性能而言,您绝对要避免多次小数据传输。
答
我不确定数据的来源,但可以使用平坦的内存空间并使用索引偏移作为访问内存的索引。
即
节点将被定义为:
struct Node
{
unsigned int name;
unsigned int number_of_children;
unsigned int parent;
unsigned int children;
}
你会的malloc内存一个大区块,并建立您的树在那里。 (保留最后插入物品的地方的记忆计数器)。
你这样做也可以添加字符串。
这样你会有一个连续的内存块,它会是一个简单的内存拷贝。访问一个简单的演员将工作的项目。
意思是重写树和字符串代码,但会保持一致。如果你不知道你的内存有多大,你可以这样做,就是页面,并将引用改为一对整数,这将使分配内存更容易。
Peter。 PS:嵌入式工程师不是CUDA程序员,但遇到了类似的问题,不需要执行解析就可以跨处理器移动树。