是否可以将内存添加到全局内存中先前分配的数组?
我需要做的是:
//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会删除以前分配的数组的值吗?在我的情况下,应该保留先前分配的数组的值......
答案 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一个所需大小的新数组,并从现有数组中复制内容。
如果您经常这样做,那么每次都需要进行更多的操作,以避免代价高昂的(在处理时间方面)重新分配操作。