Во-первых, cudaMalloc ведет себя как malloc, а не realloc.Это означает, что cudaMalloc выделит совершенно новую память устройства в новом месте.В API cuda нет функции realloc.
Во-вторых, в качестве обходного пути вы можете просто снова использовать cudaMalloc, чтобы выделить больше памяти.Не забудьте освободить указатель устройства с помощью cudaFree, прежде чем назначить новый адрес d_a
.Следующий код функционально , что вы хотите.
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
один раз с достаточным объемом памяти для наибольшего варианта использования?Вероятно, нет причин выделять только 100 байтов, если вы знаете, что вам понадобится 1000 байтов позже!
//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);
}