Мне нужно декодировать RLE в CUDA, и я пытался подумать о наиболее эффективном способе расширения RLE в список со всеми моими значениями. Итак, скажем, мои значения равны 2, 3, 4, а мои прогоны - 3, 3, 1. Я хочу расширить это до 2, 2, 2, 3, 3, 3, 4.
Сначала я думал, что могу использовать cudaMemset
, но теперь я почти уверен, что это запускает ядро, и у меня есть CUDA Compute Capability 3.0, поэтому, даже если запуск нового ядра для каждой пары значение / запуск, вероятно, не будет неэффективным, у меня нет динамического параллелизма доступны для этого.
Поэтому я хочу знать, правильно ли это решение, прежде чем я пойду и реализую его, поскольку есть так много вещей, которые в конечном итоге не работают на CUDA, если вы не умны. Было бы разумно сделать ядро, которое будет вызывать cudaMalloc
, а затем cudaMemCpy к месту назначения? Я могу легко вычислить суммы префиксов, чтобы знать, куда копировать память и откуда, и сделать так, чтобы все мои чтения были, по крайней мере, объединены. Что меня беспокоит, так это то, что я так часто звоню cudaMalloc
и cudaMemCpy
.
Другой возможный вариант — записать эти значения в разделяемую память, а затем скопировать их в глобальную память. Я хочу знать, должно ли мое первое решение работать и быть эффективным, или мне придется сделать последнее.