我需要在 CUDA 中解码 RLE,并且我一直在尝试考虑将 RLE 扩展为包含我所有值的列表的最有效方法。假设我的值是 2, 3, 4,我的运行次数是 3, 3, 1,我想将其扩展到 2, 2, 2, 3, 3, 3, 4。
起初我以为我可以使用cudaMemset
,但我现在非常确定它会启动一个内核,并且我有 CUDA 计算能力 3.0,所以即使为每个进程启动一个新内核可能效率不低值/运行对我没有可用的动态并行性来执行此操作。
因此,在实现该解决方案之前,我想知道该解决方案是否合理,因为如果您不聪明,有很多事情最终无法在 CUDA 上正常运行。制作一个调用 cudaMalloc 然后调用 cudaMemCpy 到目的地的内核是否合理?我可以轻松地计算前缀和,以了解将内存复制到何处或从何处复制,并使我的所有读取至少合并。我担心的是多次调用 cudaMalloc
和 cudaMemCpy
。
另一个可能的选择是将这些值写入共享内存,然后将它们复制到全局内存。我想知道我的第一个解决方案是否可行且高效,或者我是否必须执行后者。
最佳答案
您不想考虑为每个值/运行对执行单独的操作(例如 cudaMalloc
或 cudaMemset
)。
计算运行序列的前缀和后,前缀和中的最后一个值将是总分配大小。将其用于整个最终扩展序列的单个 cudaMalloc
操作。
一旦分配了必要的空间并计算了前缀和,实际的扩展就非常简单了。
thrust如果您想要一个快速原型(prototype),可以使这变得非常容易。有an example code为了它。
关于cuda - 高效解码 CUDA 中的 RLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36698270/