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)
我不相信这是受支持的。 cudaMalloc()
分配设备内存,但将地址存储在主机上的变量中。在 for 循环中,您将传递设备内存中的地址。
根据您想要完成的任务,您可能希望在调用当前的 for 循环之前data
使用普通主机进行分配。malloc()
或者分配一大块设备内存并手动计算偏移量。
请参阅《CUDA 编程指南》的第 2.4、3.2.1 和 B.2.5 节(底部),了解更多相关讨论。具体来说,在第108页的底部:
__device__
通过取,__shared__
或 变量的地址获得的地址__constant__
只能在设备代码中使用。