如何使用CUDA执行结构体的深度复制?

7

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

我有三个嵌套的结构体,如下:

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

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

typedef struct {
    Matrix* tables;
    int count;
} Container;

因此,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;
}

也就是说,一个包含20个矩阵,每个矩阵有100个元素的容器。

  • 我该如何使用cudaMemCpy()将这些数据复制到设备内存中?
  • 有没有好的方法可以在主机和设备之间执行“结构体的结构体”的深度复制?

感谢您的时间。

安德烈亚

1个回答

3
简短回答是“不要这样做”。我这么说的原因有四个:
1. API 中没有深拷贝功能 2. 你将不得不编写大量代码来设置和复制你所描述的结构到 GPU 上,这将非常复杂(至少需要约 4000 个 API 调用,并且可能需要一个中间内核来处理你的 20 个 100 单元格的矩阵示例) 3. 使用三级指针间接引用的 GPU 代码将具有极大的内存访问延迟,并会破坏 GPU 上可用的很少的缓存一致性 4. 如果你想在之后将数据复制回主机,则会出现相同的问题
考虑使用线性内存和索引代替。它在主机和 GPU 之间可移植,而分配和复制开销仅为基于指针的替代方案的 1%。
如果你真的想这样做,请留下评论,我会尽力找到一些旧的代码示例,展示在 GPU 上嵌套指针的完全愚蠢。

我读了很多关于使用线性内存和展平数组的内容。实际上,我将Matrix结构体中的elements字段作为线性内存进行管理,而高级表示形式将是2D的。 我也想尝试将3个结构体线性化/展平,但是如何做到这一点呢?管理所有索引不会太困难吗?无论如何,感谢您的帮助,不必费心寻找旧代码! - Andrea
@talonmies,我很想看看你以前关于嵌套指针的一些旧代码示例。 - A_Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接