如何使用CUDA执行struct的深度复制?
使用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中没有深层复制function
- 你必须编写的结果代码设置并将你描述的结构复制到GPU将是非常复杂的(至少4000个API调用,可能是你的20个100个单元格的例子的中间内核)
- 使用三级指针间接的GPU代码将大大增加内存访问延迟,并将破坏GPU上可用的小缓存一致性
- 如果您想在之后将数据复制回主机,则反向遇到同样的问题
请考虑使用线性内存和索引。 它在主机和GPU之间是可移植的,并且分配和复制开销约为基于指针的备选方案的1%。
如果你真的想这样做,请留下评论,我会尝试挖掘一些旧的代码示例,这些示例显示了GPU上完整的愚蠢嵌套指针。