【问题标题】:How to perform deep copying of struct with CUDA? [duplicate]如何使用 CUDA 对结构进行深度复制? [复制]
【发布时间】:2011-07-03 16:20:51
【问题描述】:

使用 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;

所以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() 将此数据复制到设备内存中?
  • 有没有什么好的方法可以从主机到设备执行“struct of struct”的深层复制?

感谢您的宝贵时间。

安德烈亚

【问题讨论】:

    标签: c++ c deep-copy cuda


    【解决方案1】:

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

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

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

    如果您真的想要这样做,请发表评论,我会尝试挖掘一些旧代码示例,以展示 GPU 上完全愚蠢的嵌套指针是什么。

    【讨论】:

    • 我阅读了很多关于使用线性内存和扁平化数组的内容。实际上,我将Matrix 结构中的字段elements 管理为线性内存,而高级表示将是二维的。我也会尝试线性化/扁平化 3 结构,但我该怎么做呢?管理所有索引会不会太难?无论如何,感谢您的帮助,不要费心寻找一些旧代码!
    • @talonmies 我有兴趣看到一些关于嵌套指针的旧代码示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多