是否可以将内存添加到全局内存中先前分配的数组中?
我需要做的是:
//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/