2016-04-18 7 views
1

Мне нужно декодировать RLE в CUDA, и я пытаюсь подумать о наиболее эффективном способе расширения RLE в список со всеми моими значениями. Так что мои значения - 2, 3, 4, а мои пробеги - 3, 3, 1. Я хочу развернуть это до 2, 2, 2, 3, 3, 3, 4.Декодирование RLE в CUDA эффективно

Сначала я подумал, что могу использовать cudaMemset, но теперь я уверен, что запускает ядро, и у меня есть CUDA Compute Capability 3.0, поэтому, даже если бы не было возможно неэффективно запускать новое ядро ​​для каждой пары value/run, у меня нет динамического параллелизма, доступного для этого.

Так что я хочу знать, действительно ли это решение звучит, прежде чем я пойду и реализую его, так как есть очень много вещей, которые в конечном итоге не работают на CUDA, если вы не умны. Было бы разумным сделать ядро, которое будет звонить cudaMalloc, а затем cudaMemCpy в пункт назначения? Я могу легко вычислить суммы префикса, чтобы знать, где копировать память и из нее, и сделать все мои чтения, по крайней мере, объединенными. Я беспокоюсь о том, что так много раз звонил cudaMalloc и cudaMemCpy.

Другой потенциальный вариант - записать эти значения в общую память и затем скопировать их в глобальную память. Я хочу знать, должно ли мое первое решение работать и быть эффективным, или если я должен сделать последнее.

ответ

3

Вы не хотите думать о выполнении отдельной операции (например, cudaMalloc или cudaMemset) для каждой пары значений/прогона.

После вычисления суммы префикса в последовательности выполнения последним значением в сумме префикса будет общий размер выделения. Используйте это для одной операции cudaMalloc для всей окончательной расширенной последовательности.

Как только у вас будет выделено необходимое пространство и вычислена префиксная сумма, фактическое расширение довольно простое.

thrust может сделать это довольно легко, если вы хотите быстрый прототип. Для этого есть an example code.

+0

Robert Вы один из самых удивительных людей вокруг. Вы решили каждую проблему, с которой я когда-либо сталкивался в CUDA. Спасибо! – flips

0

@RobertCrovella, конечно, правильный, но вы можете пойти еще дальше с точки зрения эффективности, если у вас есть способность слегка подстроить вашу сжатую sceheme.

Извините за самозатухание, но вас может заинтересовать my own implementation варианта кодирования длины пробега с добавлением привязки выходных позиций к входу (например, «в котором смещение, в котором выполняется мы имеют 2048-й элемент? »); это позволяет более справедливо распределять работу с потоковыми блоками и избегать необходимости полной версии префикса. Он по-прежнему работает, поэтому я набираю ~ 34 ГБ/с на плате памяти с пропускной способностью 336 ГБ/с (Titan X) на момент написания, но он вполне применим.

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

  • Нет связанных вопросов^_^