2012-03-20 4 views
1

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

Если я выделить память из-за ожидания, что данные таблиц, почти похоже, что я могу получить огромное количество памяти, которая не используется на всех

Итак, есть ли какой-нибудь способ, чтобы выполнить выделение памяти динамически с помощью CUDA для эффективного использования памяти?

+0

Не понимаю вопроса. cudaMalloc * - динамическое распределение памяти во время выполнения. Вы спрашиваете о распределении памяти внутри запущенного ядра или что-то еще? – talonmies

+0

Вы как-то ожидаете, что cudaMalloc автоматически зарезервирует дополнительный бит памяти для вашего массива, если вам нужно его расширить? – Bart

+0

Я имею в виду, что массив сначала выделяется с минимальным размером перед запуском ядра, но он может быть расширен (дополнительное выделение памяти), пока ядро ​​работает – dmdkv

ответ

2

Невозможно динамически расширять ранее выделенную память внутри ядра. Самое близкое, что вы получаете, это «новое» и «удаление» на Ферми. Но они выделяют новые куски, они не расширяют ваш существующий кусок. Однако я не вижу смысла пытаться расширить выделенную память внутри ядра. Просто выделите максимальный объем памяти, который может использоваться ядрами спереди. Если это означает, что у вас недостаточно памяти для завершения обработки данных впоследствии, тогда программа не смогла бы обрабатывать этот случай в любом случае, если бы вы могли динамически расширять память.

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

Смежные вопросы