Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA中RLE的高效解码_Cuda_Compression_Run Length Encoding - Fatal编程技术网

CUDA中RLE的高效解码

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上不能很好地

我需要在CUDA中解码一个RLE,我一直在努力思考如何最有效地将RLE扩展到一个包含我所有值的列表中。假设我的值是2,3,4,我的行程是3,3,1,我想把它扩展到2,2,2,3,3,4

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

所以在我开始实施之前,我想知道这个解决方案是否合理,因为如果你不聪明的话,有太多事情最终在CUDA上不能很好地工作。让内核调用
cudamaloc
然后将cudaMemCpy发送到目标是否合理?我可以很容易地计算前缀和,以知道在哪里复制内存,并使我所有的阅读至少结合起来。我担心的是多次调用
cudamaloc
cudaMemCpy


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

您不想考虑对每个值/运行对执行单独的操作(例如
cudamaloc
,或
cudaMemset

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

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


如果你想要一个快速的原型,可以让这变得非常简单。这是有道理的。

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


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

Robert you是最棒的人之一。你解决了我在CUDA上遇到的所有问题。非常感谢。