CUDA分配数组数组

5 memory-management cuda allocation

我在CUDA中分配数组数组时遇到了一些麻烦.

void ** data;
cudaMalloc(&data, sizeof(void**)*N); // allocates without problems
for(int i = 0; i < N; i++) {
    cudaMalloc(data + i, getSize(i) * sizeof(void*)); // seg fault is thrown
}
Run Code Online (Sandbox Code Playgroud)

我错了什么?

fab*_*ioM 11

您必须将指针分配给主机内存,然后为每个阵列分配设备内存并将其指针存储在主机内存中.然后分配用于将指针存储到设备中的内存,然后将主机内存复制到设备内存.一个例子值1000字:

__global__ void multi_array_kernel( int N, void** arrays ){
    // stuff
}


int main(){

    const int N_ARRAYS = 20;
    void *h_array = malloc(sizeof(void*) * N_ARRAYS);
    for(int i = 0; i < N_ARRAYS; i++){
        cudaMalloc(&h_array[i], i * sizeof(void*));
        //TODO: check error
    }
    void *d_array = cudaMalloc(sizeof(void*) * N_ARRAYS);

    // Copy to device Memory
    cudaMemcpy(d_array, h_array, sizeof(void*) * N_ARRAYS, cudaMemcpyHostToDevice);

    multi_array_kernel<1,1>(N_ARRAYS, d_array);
    cudaThreadSynchronize();

    for(int i = 0; i < N_ARRAYS; i++){
        cudaFree(h_array[i]); //host not device memory
        //TODO: check error
    }
    cudaFree(d_array);
    free(h_array);
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*iel 4

我不相信这是受支持的。 cudaMalloc()分配设备内存,但将地址存储在主机上的变量中。在 for 循环中,您将传递设备内存中的地址。

根据您想要完成的任务,您可能希望在调用当前的 for 循环之前data使用普通主机进行分配。malloc()或者分配一大块设备内存并手动计算偏移量。

请参阅《CUDA 编程指南》的第 2.4、3.2.1 和 B.2.5 节(底部),了解更多相关讨论。具体来说,在第108页的底部:

__device__通过取,__shared__或 变量的地址获得的地址__constant__只能在设备代码中使用。