如何使用CUDA执行struct的深度复制?

And*_*rea 7 c c++ cuda deep-copy

使用CUDA编程我在尝试将一些数据从主机复制到gpu时遇到了问题.

我有3个嵌套结构,如下所示:

typedef struct {
    char data[128];
    short length;
} Cell;

typedef struct {
    Cell* elements;
    int height;
    int width;
} Matrix;

typedef struct {
    Matrix* tables;
    int count;
} Container;
Run Code Online (Sandbox Code Playgroud)

所以Container"包括"一些Matrix元素,而这些Cell元素又包含一些元素.

假设我以这种方式动态分配主机内存:

Container c;
c.tables = malloc(20 * sizeof(Matrix));

for(int i = 0;i<20;i++){
    Matrix m;
    m.elements = malloc(100 * sizeof(Cell));
    c.tables[i] = m;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,每个100个单元的20个矩阵的容器.

  • 我现在如何使用cudaMemCpy()将此数据复制到设备内存?
  • 有没有什么好方法可以从主机到设备执行"struct of struct"的深层复制?

谢谢你的时间.

安德里亚

tal*_*ies 3

简短的回答是“只是不要”。我这么说有四个原因:

  1. API中没有深复制功能
  2. 您必须编写的生成代码来设置和复制您所描述的结构到 GPU 将非常复杂(至少大约 4000 个 API 调用,并且可能是您的 20 个 100 个单元矩阵示例的中间内核)
  3. 使用三级指针间接寻址的 GPU 代码将大大增加内存访问延迟,并将破坏 GPU 上可用的少量缓存一致性
  4. 如果事后想将数据复制回主机,反过来也会有同样的问题

考虑使用线性内存和索引。它可以在主机和 GPU 之间移植,并且分配和复制开销约为基于指针的替代方案的 1%。

如果你真的想这样做,请发表评论,我将尝试挖掘一些旧的代码示例,这些示例展示了 GPU 上的完全愚蠢的嵌套指针。