Выделение дополнительной памяти для существующего массива глобальной памяти - PullRequest
2 голосов
/ 12 апреля 2011

возможно ли добавить память к ранее выделенному массиву в глобальной памяти?

что мне нужно сделать, это:

//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 значения ранее выделенного массива? в моем случае следует сохранить значения предыдущего выделенного массива ...

Ответы [ 3 ]

5 голосов
/ 12 апреля 2011

Во-первых, 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);
}
3 голосов
/ 12 апреля 2011

Ваш psuedocode вообще не "добавляет память к ранее выделенному массиву". Стандартный C-способ увеличения размера существующего выделения - через функцию realloc (), и на момент написания не существует эквивалента realloc () в CUDA.

Когда вы делаете

cudaMalloc(d_A....)

// something

cudaMalloc(d_A....)

все, что вы делаете, это создаете новое выделение памяти и присваиваете его d_A. Предыдущее распределение памяти все еще существует, но теперь вы потеряли значение указателя предыдущей памяти и не можете получить к нему доступ. Основываясь на этом и вашем предыдущем вопросе почти на ту же тему, могу ли я предложить вам потратить немного времени на пересмотр концепций памяти и указателей в C до того, как вы попробуете CUDA, потому что, если у вас нет очень четкого понимания этих основ, вы найдете Распределенная память природы CUDA очень запутанная,

0 голосов
/ 12 апреля 2011

Я не уверен, какие сложности cuda добавляет к миксу (?), Но в c вы не можете добавить память к уже выделенному массиву.

Если вы хотите вырастить массив malloc, вам нужно собрать новый массив нужного вам размера и скопировать содержимое из существующего массива.

Если вы делаете эточасто тогда, вероятно, стоит ошибиться больше, чем нужно каждый раз, чтобы избежать дорогостоящих (с точки зрения времени обработки) операций перераспределения.

...