Уплотнение CUDA Stream: понимание концепции - PullRequest
5 голосов
/ 05 декабря 2011

Я использую CUDA / Thrust / CUDPP. Как я понимаю, при сжатии потока определенные элементы в массиве помечаются как недействительные, а затем «удаляются».

Теперь, что на самом деле означает «удаление»? Предположим, что исходный массив A имеет длину 6. Если 2 элемента недопустимы (при любых условиях, которые мы можем предоставить), то

  1. Создает ли система новый массив размера 4 в памяти GPU для хранения допустимых элементов для получения окончательного результата?

  2. ИЛИ физически удаляет недопустимые элементы из памяти и сжимает исходный массив Размер 4, сохраняющий только допустимые элементы?

В любом случае, не означает ли это, что динамическое распределение памяти происходит под капотом? Но я слышал, что динамическое распределение памяти невозможно в мире CUDA.

1 Ответ

4 голосов
/ 06 декабря 2011

Во-первых, динамическое выделение памяти возможно в CUDA на устройствах Compute Capability 2.0 и выше. Библиотека времени выполнения CUDA поддерживает функции malloc / free и new / delete в __device__. Но на самом деле это не уместно для ответа.

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

...