memory-management - 为现有全局内存阵列分配更多内存

标签 memory-management cuda

是否可以将内存添加到全局内存中先前分配的数组中?

我需要做的是:

//cudamalloc memory for d_A
int n=0;int N=100;
do
{
 Kernel<<< , >>> (d_A,n++);
 //add N memory to d_A
 while(n!=5)}

执行另一个 cudamalloc 是否会删除先前分配的数组的值?就我而言,应保留先前分配的数组的值...

最佳答案

首先,cudaMalloc 的行为类似于 malloc,而不是 realloc。这意味着 cudaMalloc 将在新位置分配全新的设备内存。 cuda API中没有realloc函数。

其次,作为解决方法,您可以再次使用 cudaMalloc 来分配更多内存。请记住在为 d_a 分配新地址之前使用 cudaFree 释放设备指针。以下代码在功能上正是您想要的。

int n=0;int N=100;

//set the initial memory size
size = <something>;

do
{
    //allocate just enough memory
    cudaMalloc((void**) &d_A, size);

    Kernel<<< ... >>> (d_A,n++);   

    //free memory allocated for d_A
    cudaFree(d_A);

    //increase the memory size
    size+=N;

while(n!=5)}

第三,cudaMalloc 可能是一个昂贵的操作,我预计上面的代码会相当慢。我认为你应该考虑为什么要增加数组。您能否为 d_A 分配一次内存,并为最大的用例提供足够的内存?如果您知道稍后需要 1,000 字节,则可能没有理由只分配 100 字节!

//calculate the max memory requirement
MAX_SIZE = <something>;

//allocate only once
cudaMalloc((void**) &d_A, MAX_SIZE);

//use for loops when they are appropriate
for(n=0; n<5; n++)
{
    Kernel<<< ... >>> (d_A,n);
}

关于memory-management - 为现有全局内存阵列分配更多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5632247/

相关文章:

android - Imageview 和 Imagebutton 在操作系统内存占用方面的区别

c++ - 对象列表应该存储在堆上还是堆栈上?

c++ - 如何检测指针是否被删除并安全删除?

c++ - C++:如何安全地取消分配 vector 的堆分配数组?

c - 为什么 mmap 在这里不起作用

c - 使用 CUDA C 的 2D 矩阵的积分图像或求和面积表

c - 在 CUDA C 中确定计算机在运行时是否有 GPU

c++ - 如何获得适合 gpu 内存的最大数组大小?

c++ - cudaMemcpy 无效参数

c++ - transform_reduce 中的 thrust::system::system_error