如何用CUDA进行结构的深度复制?[英] How to perform deep copying of struct with CUDA?

本文是小编为大家收集整理的关于如何用CUDA进行结构的深度复制?的处理方法,想解了如何用CUDA进行结构的深度复制?的问题怎么解决?如何用CUDA进行结构的深度复制?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

与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;

so 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;
}

即,每个100个单元的20个矩阵的容器.

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

感谢您的时间.

Andrea

推荐答案

简短的答案是"只是不要".我说这是四个原因:

  1. API中没有深层复制功能
  2. 您将必须进行写入并将所描述的结构复制到GPU的结果代码非常复杂(最少约4000个API调用,并且可能是您20个单元格的20个矩阵的中间内核)
  3. 使用三个级别指针间接的GPU代码将大大增加内存访问延迟,并且会破坏GPU上几乎没有可用的Cache相干性
  4. 如果您想将数据复制回主机,则在反向中遇到相同的问题

考虑使用线性内存和索引.它是主机和GPU之间的便携式,分配和复制开销约为基于指针的替代方案的1%.

如果您真的想做这件事,请发表评论,我将尝试挖掘一些旧的代码示例,这些示例显示了GPU上的完整愚蠢的指针.

本文地址:https://www.itbaoku.cn/post/359316.html