【问题标题】:Decoding RLE in CUDA efficiently在 CUDA 中高效解码 RLE
【发布时间】:2017-02-16 18:23:54
【问题描述】:

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

起初我以为我可以使用cudaMemset,但我现在很确定启动内核并且我拥有 CUDA Compute Capability 3.0 所以即使为每个值/运行对启动新内核可能不是低效的,我没有可用于执行此操作的动态并行性。

所以我想知道这个解决方案是否合理,然后再实施它,因为如果你不聪明的话,很多事情最终都无法在 CUDA 上正常运行。制作一个将调用cudaMalloc 然后将 cudaMemCpy 调用到目的地的内核是否合理?我可以很容易地计算前缀总和,以知道将内存复制到哪里和从哪里复制,并使我所有的阅读至少合并。我担心的是多次致电cudaMalloccudaMemCpy

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

【问题讨论】:

    标签: cuda compression run-length-encoding


    【解决方案1】:

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

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

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

    如果你想要一个快速的原型,thrust 可以很容易地做到这一点。有an example code

    【讨论】:

    • 罗伯特,你是周围最棒的人之一。您已经解决了我在 CUDA 上遇到的所有问题。谢谢!
    【解决方案2】:

    @RobertCrovella 当然是正确的,但如果您有余地稍微调整压缩方案,您可以在效率方面走得更远。

    对不起,自插入,但您可能对运行长度编码变体的my own implementation 感兴趣,并在输入中添加了输出位置的锚定(例如“在哪个偏移中执行我们有第 2048 个元素?");这允许更公平地将工作分配给线程块,并避免需要完整的前缀和。它仍在进行中,因此在撰写本文时,我只能在 336 GB/秒的内存带宽卡 (Titan X) 上获得约 34 GB/秒的速度,但它非常有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 2015-05-09
      • 1970-01-01
      • 2017-07-07
      • 2011-05-26
      • 2019-01-31
      相关资源
      最近更新 更多