CUDA中RLE的高效解码
我需要在CUDA中解码一个RLE,我一直在努力思考如何最有效地将RLE扩展到一个包含我所有值的列表中。假设我的值是2,3,4,我的行程是3,3,1,我想把它扩展到2,2,2,3,3,4 起初我认为我可以使用CUDA中RLE的高效解码,cuda,compression,run-length-encoding,Cuda,Compression,Run Length Encoding,我需要在CUDA中解码一个RLE,我一直在努力思考如何最有效地将RLE扩展到一个包含我所有值的列表中。假设我的值是2,3,4,我的行程是3,3,1,我想把它扩展到2,2,2,3,3,4 起初我认为我可以使用cudaMemset,但现在我非常确定,它会启动一个内核,而且我有CUDA计算能力3.0,因此,即使为每个值/运行对启动一个新内核可能不是低效的,我也没有可用的动态并行性来执行此操作 所以在我开始实施之前,我想知道这个解决方案是否合理,因为如果你不聪明的话,有太多事情最终在CUDA上不能很好地
cudaMemset
,但现在我非常确定,它会启动一个内核,而且我有CUDA计算能力3.0,因此,即使为每个值/运行对启动一个新内核可能不是低效的,我也没有可用的动态并行性来执行此操作
所以在我开始实施之前,我想知道这个解决方案是否合理,因为如果你不聪明的话,有太多事情最终在CUDA上不能很好地工作。让内核调用cudamaloc
然后将cudaMemCpy发送到目标是否合理?我可以很容易地计算前缀和,以知道在哪里复制内存,并使我所有的阅读至少结合起来。我担心的是多次调用cudamaloc
和cudaMemCpy
另一个可能的选择是将这些值写入共享内存,然后将它们复制到全局内存。我想知道我的第一个解决方案是否有效,或者我是否必须执行后者。您不想考虑对每个值/运行对执行单独的操作(例如
cudamaloc
,或cudaMemset
)
在计算运行序列上的前缀和之后,前缀和中的最后一个值将是总分配大小。将其用于整个最终扩展序列的单个cudamaloc
操作
一旦分配了必要的空间并计算了前缀和,实际的扩展就非常简单了
如果你想要一个快速的原型,可以让这变得非常简单。这是有道理的。@RobertCrovella当然是正确的,但如果你有余地稍微调整你的压缩方案,你可以在效率方面走得更远
很抱歉自我插入,但您可能对一种游程长度编码的变体感兴趣,它将输出位置锚定到输入中(例如,“我们在哪个游程中有2048元素?”;这允许更公平地将工作分配给线程块,并避免了对完整前缀和的需要。这项工作仍在进行中,因此在撰写本文时,我在336 GB/秒的存储带宽卡(Titan X)上只能获得约34 GB/秒的带宽,但它非常有用。Robert you是最棒的人之一。你解决了我在CUDA上遇到的所有问题。非常感谢。