如何使用cuda正确malloc struct A
?
struct B
{
int* pointerToInt;
int arraySize;
};
struct A
{
B* pointerToB;
int arraySize;
};
答案 0 :(得分:1)
如果在主机内存上分配,我们可以考虑这样做:
struct A* h_A;
h_A = malloc(sizeof(struct A));
h_A->arraySize = 10;
h_A->pointerToB = malloc(10 * sizeof(struct B));
for (int i = 0; i < 10; i++) {
struct B h_B = (h_A->pointerToB)[i];
h_B.arraySize = i + 5;
h_B.pointerToInt = malloc((i + 5) * sizeof(int));
}
如果我们尝试使用cudaMalloc
执行类似的操作:
struct A* d_A;
cudaMalloc(&d_A, sizeof(struct A));
d_A->arraySize = 10; /*** error ***/
cudaMalloc(&(d_A->pointerToB), 10 * sizeof(struct B)); /*** error ***/
...
我们会遇到分段错误错误,因为我们正在尝试取消引用在设备内存中分配的d_A
。我们无法使用解除引用运算符从主机代码访问设备内存。
一种可能的解决方案是在设备代码中为struct B
分配设备内存。您可以在设备代码中使用malloc
或free
来动态分配设备内存。请参阅本节B.20. Dynamic Global Memory Allocation and Operations关于CUDA编程指南
将2D阵列展平为1D阵列可能是更好的解决方案。