cuda - 高效解码 CUDA 中的 RLE

标签 cuda compression run-length-encoding

我需要在 CUDA 中解码 RLE,并且我一直在尝试考虑将 RLE 扩展为包含我所有值的列表的最有效方法。假设我的值是 2, 3, 4,我的运行次数是 3, 3, 1,我想将其扩展到 2, 2, 2, 3, 3, 3, 4。

起初我以为我可以使用cudaMemset,但我现在非常确定它会启动一个内核,并且我有 CUDA 计算能力 3.0,所以即使为每个进程启动一个新内核可能效率不低值/运行对我没有可用的动态并行性来执行此操作。

因此,在实现该解决方案之前,我想知道该解决方案是否合理,因为如果您不聪明,有很多事情最终无法在 CUDA 上正常运行。制作一个调用 cudaMalloc 然后调用 cudaMemCpy 到目的地的内核是否合理?我可以轻松地计算前缀和,以了解将内存复制到何处或从何处复制,并使我的所有读取至少合并。我担心的是多次调用 cudaMalloccudaMemCpy

另一个可能的选择是将这些值写入共享内存,然后将它们复制到全局内存。我想知道我的第一个解决方案是否可行且高效,或者我是否必须执行后者。

最佳答案

您不想考虑为每个值/运行对执行单独的操作(例如 cudaMalloccudaMemset)。

计算运行序列的前缀和后,前缀和中的最后一个值将是总分配大小。将其用于整个最终扩展序列的单个 cudaMalloc 操作。

一旦分配了必要的空间并计算了前缀和,实际的扩展就非常简单了。

thrust如果您想要一个快速原型(prototype),可以使这变得非常容易。有an example code为了它。

关于cuda - 高效解码 CUDA 中的 RLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36698270/

相关文章:

c++ - 结合CUDA 9和GCC4.3编译的C++软件

c++ - Cuda 分配和返回数组从 gpu 到 cpu

asp.net - 压缩ASP.Net脚本资源

R - 按键查找连续值的最大数量

arrays - 重复数组元素 : Run-length decoding in MATLAB 的副本

Cuda 2D内存分配和复制问题

cmake - cooperative_groups::this_grid() 导致任何 CUDA API 调用返回 'unknown error'

c++ - 如何知道 jpeg 图像的压缩率?

.net - .NET 可以使用哪些 HMM(隐马尔可夫模型)压缩库?

c# - 游程编码假设