Как сделать cudaMalloc динамически - PullRequest
1 голос
/ 21 марта 2012

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

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

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

1 Ответ

2 голосов
/ 21 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...