将树复制到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程序员,但遇到了类似的问题,不需要执行解析就可以跨处理器移动树。