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

前端之家收集整理的这篇文章主要介绍了c – 如何使用CUDA执行struct的深度复制?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Copying a struct containing pointers to CUDA device3个
使用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;
}

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

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

谢谢你的时间.

安德里亚

解决方法

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

> API中没有深层复制功能
>您必须编写的结果代码设置并将您描述的结构复制到GPU将是非常复杂的(至少4000个API调用,并且可能是20 Matrix of 100 Cells示例的中间内核)
>使用三级指针间接的GPU代码将大大增加内存访问延迟,并将破坏GPU上可用的小缓存一致性
>如果您想在之后将数据复制回主机,则反向遇到同样的问题

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

如果你真的想这样做,请留下评论,我会尝试挖掘一些旧的代码示例,这些示例显示了GPU上完整的愚蠢嵌套指针.

猜你在找的C&C++相关文章