是否可以将内存添加到全局内存中先前分配的数组?将更多的内存分配给现有的全局内存阵列
什么,我需要做的是这样的:
//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 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删除以前分配的数组的值?在我的情况下,应该保持以前分配的数组的值...
我不知道cuda增加了混合(?)会有什么并发症,但是在c中,您无法将内存添加到已分配的数组中。
如果你想增长一个malloc'd数组,你需要malloc一个你需要的大小的新数组,并复制现有数组中的内容。
如果你经常这样做,那么为了避免代价高昂(在处理时间方面)重新分配操作,它可能比每次需要更多的mallocing。
'realloc'将内存添加到已经有'malloc'ed的数组中。但是,没有cudaMalloc,所以你的答案确实适用。 – 2011-04-12 08:30:02
我相信'realloc'只有在当前块有剩余空间的情况下才会这样。否则,它只是分配新的空间和拷贝整个旧数据完全如上所述。 – 2011-04-12 15:28:26
你相信不正确。'realloc'扩展块,如果有未分配的空间后面(如果没有,当然它必须重新定位块)。关键是,你的陈述“如果你想成长......”是不正确的,并且是错误的做法,因为realloc通常效率更高,并且肯定更容易且更不容易出错。 – 2011-04-12 22:08:22
您的psuedocode根本不会“向先前分配的数组添加内存”。增加现有分配大小的标准C方法是通过realloc()函数,并且在编写本文时,没有与realloc()等效的CUDA。
当你
cudaMalloc(d_A....)
// something
cudaMalloc(d_A....)
所有你正在做的是创造一个新的内存分配,其分配给D_A。之前的内存分配仍然存在,但是现在你已经丢失了以前内存的指针值,并且无法访问它。基于这个和你以前的几乎同一主题的问题,我建议你在尝试CUDA之前花些时间修改C语言中的内存和指针概念,因为除非你对这些基础知识有非常清楚的理解,否则你会发现CUDA的分布式内存本质很混乱,
首先,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,000字节,没有理由只分配100个字节!” – LumpN 2011-04-12 15:23:33
如果您对coc中的malloc,realloc和free不熟悉(仅举几个例子),您会发现编写CUDA程序是不可能的。一心一意!! – jmilloy 2011-04-12 15:12:18