Уплотнение CUDA Stream: понимание концепции
Я использую CUDA/Thrust/CUDPP. Как я понимаю, при сжатии потока некоторые элементы в массиве помечаются как недействительные, а затем "удаляются".
Теперь, что на самом деле означает "удаление"? Предположим, исходный массив A
и имеет длину 6. Если 2 элемента недопустимы (какими бы условиями мы ни предоставили), тогда
Создает ли система новый массив размером 4 в памяти GPU для хранения допустимых элементов для получения окончательного результата?
ИЛИ физически ли он удаляет недопустимые элементы из памяти и сжимает исходный массив А до размера 4, сохраняя только допустимые элементы?
В любом случае, не означает ли это, что динамическое распределение памяти происходит под капотом? Но я слышал, что динамическое распределение памяти невозможно в мире CUDA.
1 ответ
Во-первых, динамическое распределение памяти возможно в CUDA на устройствах Compute Capability 2.0 и выше. Библиотека времени выполнения CUDA поддерживает malloc/free и new/delete в __device__
функции. Но это не уместно для ответа, на самом деле.
Обычно предоставляется достаточно большой выходной массив (предварительно выделенный, часто того же размера, что и входной массив), и выходные данные записываются в него. Динамическое распределение не требуется, но есть потенциальные отходы хранения. Это то, что делают CUDPP и тяга. Альтернативой было бы сначала выполнить подсчет допустимых элементов, а затем динамически выделять память графического процессора с помощью cudaMalloc, вызываемого из центрального процессора.