c - 如何在内核中动态分配数组?

标签 c cuda gpgpu

我需要在内核函数中动态分配一些数组。我该怎么做?

我的代码是这样的:

__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/

相关文章:

c - 如何输入n行每行m个字符的字符串,其中可能包含空格作为字符?

c - C中函数内部函数的参数和指针

c++ - block 级原子写入

c - 使用 avcodec_decode_audio4() 解码 AAC 时出错

matlab - 如何为 Matlab 提供它想要的旧 gcc 版本?

cuda - CUDA 内核参数

带有 optimus 的 cuda 只是为了访问 gpgpu

c - GPU 上是否有内存保护

c++ - 如何应对修改原子值

c - 如何检查一个数组中的特定字符串是否在另一个数组中