CUDA中数组结构阵列的Malloc结构

时间:2018-02-01 03:51:20

标签: cuda

如何使用cuda正确malloc struct A

struct B
{
    int* pointerToInt;
    int arraySize;
};
struct A
{
    B* pointerToB;
    int arraySize;
};

1 个答案:

答案 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分配设备内存。您可以在设备代码中使用mallocfree来动态分配设备内存。请参阅本节B.20. Dynamic Global Memory Allocation and Operations关于CUDA编程指南

将2D阵列展平为1D阵列可能是更好的解决方案。