将树复制到GPU内存

时间:2011-03-25 10:55:20

标签: c++ c cuda

我有一个节点树,我想复制到GPU memroy。 Node看起来像这样:

struct Node
{
    char *NodeName;
    int NumberOfChildren;
    Node *Children;
    Node *Parent; 
}

每个节点都有一个动态数量的子节点但只有一个父节点。如何将此树复制到CUDA全局内存?我应该通过树BFS并分配/复制数据到GPU吗?或者我可以使用单个cuda内存复制指令吗?

2 个答案:

答案 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 */
}

然后在分配后遍历树,分配给新节点。

就性能而言,您肯定希望避免多次小数据传输。