2011-04-12 71 views
2

是否可以将内存添加到全局内存中先前分配的数组?将更多的内存分配给现有的全局内存阵列

什么,我需要做的是这样的:

//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删除以前分配的数组的值?在我的情况下,应该保持以前分配的数组的值...

+1

如果您对coc中的malloc,realloc和free不熟悉(仅举几个例子),您会发现编写CUDA程序是不可能的。一心一意!! – jmilloy 2011-04-12 15:12:18

回答

-2

我不知道cuda增加了混合(?)会有什么并发症,但是在c中,您无法将内存添加到已分配的数组中。

如果你想增长一个malloc'd数组,你需要malloc一个你需要的大小的新数组,并复制现有数组中的内容。

如果你经常这样做,那么为了避免代价高昂(在处理时间方面)重新分配操作,它可能比每次需要更多的mallocing。

+0

'realloc'将内存添加到已经有'malloc'ed的数组中。但是,没有cudaMalloc,所以你的答案确实适用。 – 2011-04-12 08:30:02

+0

我相信'realloc'只有在当前块有剩余空间的情况下才会这样。否则,它只是分配新的空间和拷贝整个旧数据完全如上所述。 – 2011-04-12 15:28:26

+2

你相信不正确。'realloc'扩展块,如果有未分配的空间后面(如果没有,当然它必须重新定位块)。关键是,你的陈述“如果你想成长......”是不正确的,并且是错误的做法,因为realloc通常效率更高,并且肯定更容易且更不容易出错。 – 2011-04-12 22:08:22

3

您的psuedocode根本不会“向先前分配的数组添加内存”。增加现有分配大小的标准C方法是通过realloc()函数,并且在编写本文时,没有与realloc()等效的CUDA。

当你

cudaMalloc(d_A....) 

// something 

cudaMalloc(d_A....) 

所有你正在做的是创造一个新的内存分配,其分配给D_A。之前的内存分配仍然存在,但是现在你已经丢失了以前内存的指针值,并且无法访问它。基于这个和你以前的几乎同一主题的问题,我建议你在尝试CUDA之前花些时间修改C语言中的内存和指针概念,因为除非你对这些基础知识有非常清楚的理解,否则你会发现CUDA的分布式内存本质很混乱,

+2

减轻 - 注释//将N内存添加到d_A旨在用于不存在的cuda realloc函数的伪代码。上述评论为 – jmilloy 2011-04-12 15:10:37

+0

-1; talonmies是对的。 – 2011-04-12 22:11:18

+0

@ jim-balter我认为talonmies的第一句话除了第一句 – jmilloy 2011-04-13 12:43:47

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

+1:“如果你知道以后需要1,000字节,没有理由只分配100个字节!” – LumpN 2011-04-12 15:23:33