为现有的全局内存阵列分配更多内存

时间:2011-04-12 08:15:12

标签: 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会删除以前分配的数组的值吗?在我的情况下,应该保留先前分配的数组的值......

3 个答案:

答案 0 :(得分:5)

首先,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);
}

答案 1 :(得分:3)

您的伪代码根本不会“向以前分配的数组添加内存”。增加现有分配大小的标准C方法是通过realloc()函数,并且在编写时没有相当于realloc()的CUDA。

当你这样做时

cudaMalloc(d_A....)

// something

cudaMalloc(d_A....)

您所做的就是创建新的内存分配并将其分配给d_A。以前的内存分配仍然存在,但现在您丢失了先前内存的指针值,无法访问它。基于这个以及您之前关于几乎相同主题的问题,我建议您在尝试CUDA之前花一点时间在C中修改内存和指针概念,因为除非您对这些基本原理有一个非常清楚的理解,否则您会发现CUDA的分布式内存性质非常混乱,

答案 2 :(得分:-2)

我不确定cuda在混音中添加了哪些复杂功能(?)但是在c中你无法为已经分配的数组添加内存。

如果要增加malloc数组,则需要malloc一个所需大小的新数组,并从现有数组中复制内容。

如果您经常这样做,那么每次都需要进行更多的操作,以避免代价高昂的(在处理时间方面)重新分配操作。