我需要在内核函数中动态分配一些数组。我该怎么做?
我的代码是这样的:
__global__ func(float *grid_d,int n, int nn){
int i,j;
float x[n],y[nn];
//Do some really cool and heavy computations here that takes hours.
}
但这行不通。如果这是在主机代码中,我可以使用 malloc。 cudaMalloc 在主机上需要一个指针,在设备上需要一个指针。在内核函数中,我没有主机指针。
那么,我该怎么办呢?
如果分配所有数组的时间太长(几秒钟)(我需要大约 4 个大小为 n 和 5 个大小为 nn),这将不是问题。因为内核可能至少会运行 20 分钟。
最佳答案
动态内存分配仅在计算能力 2.x 和更新的硬件上受支持。您可以在内核中使用 C++ new 关键字或 malloc,因此您的示例可以变成:
__global__ func(float *grid_d,int n, int nn){
int i,j;
float *x = new float[n], *y = new float[nn];
}
这会在具有上下文生命周期的本地内存运行时堆上分配内存,因此如果您不想再次使用内存,请确保在内核完成运行后释放内存。您还应该注意,无法直接从主机 API 访问运行时堆内存,因此您不能将在内核内部分配的指针作为参数传递给 cudaMemcpy
,例如。
关于c - 如何在内核中动态分配数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13480213/