Уплотнение CUDA Stream: понимание концепции

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

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

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

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

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

1 ответ

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

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

Другие вопросы по тегам