使用Nvidia的CUDA的压缩库

时间:2009-01-19 07:54:50

标签: cuda compression gpgpu

是否有人知道使用NVIDIA的CUDA library实现标准压缩方法(如Zip,GZip,BZip2,LZMA等)的项目?

我想知道可以使用大量并行任务(如压缩)的算法在显卡上的运行速度是否比双核或四核CPU快得多。

您如何看待这种方法的利弊?

6 个答案:

答案 0 :(得分:47)

我们已经完成了第一阶段的研究,以提高无损数据压缩算法的性能。 Bzip2被选为原型,我们的团队只优化了一个操作--Burrows-Wheeler转换,我们得到了一些结果:2x-4x加速了良好的可压缩文件。代码在我们所有的测试中运行得更快。

我们将完成bzip2,支持deflate和LZMA以完成一些实际任务,例如:HTTP流量和备份压缩。

博客链接: http://www.wave-access.com/public_en/blog/2011/april/22/breakthrough-in-cuda-data-compression.aspx

答案 1 :(得分:40)

不知道有人这样做并公之于众。只是恕我直言,这听起来不太有希望。

正如Martinus所指出的,一些压缩算法是高度串行的。像LZW这样的块压缩算法可以通过独立编码每个块来并行化。 Ziping一个大的文件树可以在文件级别进行并行化。

然而,这些都不是SIMD风格的并行(单指令多数据),并且它们并非大规模并行。

GPU基本上是矢量处理器,您可以在锁定步骤中执行数百或数千条ADD指令,并执行数据相关分支很少的程序。

压缩算法一般听起来更像是SPMD(单程序多数据)或MIMD(多指令多数据)编程模型,它更适合多核cpu。

视频压缩算法可以通过像CUDA这样的GPGPU处理来加速,只要有大量像素块并行进行余弦变换或卷积(用于运动检测),以及IDCT或卷积子程序可以用无分支代码表示。

GPU也喜欢具有高数值强度的算法(数学运算与内存访问的比率。)数值强度较低的算法(如添加两个向量)可以大规模并行和SIMD,但在gpu上运行速度仍然比cpu因为它们是内存限制的。

答案 2 :(得分:7)

通常,压缩算法无法使用并行任务,因此要使算法高度并行化并不容易。在您的示例中,TAR不是压缩算法,并且唯一可以高度并行化的算法是BZIP,因为它是块压缩算法。每个块都可以单独压缩,但这需要大量的内存。当你看到使用多个线程的7zip时,LZMA也不能并行工作,这是因为7zip将数据流拆分为2个不同的流,每个流都在一个单独的线程中用LZMA压缩,因此压缩算法本身并不是平行的。这种拆分仅在数据允许时才有效。

答案 3 :(得分:2)

加密算法在这方面非常成功,所以你可能想要研究一下。以下是与CUDA和AES加密相关的文章: http://www.manavski.com/downloads/PID505889.pdf

答案 4 :(得分:2)

我们正在尝试将bzip2移植到CUDA。 :)到目前为止(并且只进行了粗略的测试),我们的Burrows-Wheeler变换比串行算法快30%。 http://bzip2.github.com

答案 5 :(得分:1)

30%很不错,但对于像备份这样的应用来说,远远不够。

我的经验是,在这种情况下,平均数据流使用gzip获得1.2-1.7:1压缩,最终限制为30-60Mb / s的输出速率(这是在现代的广泛范围内(大约2010年 - 2012)中高端CPU。

这里的限制通常是数据输入CPU本身的速度。

不幸的是,为了让LTO5磁带机满意,它需要一个大约160Mb / s的原始(不可压缩)数据速率。如果输入可压缩数据,则需要更快的数据速率。

LTO压缩显然要快得多,但效率有点低(相当于gzip -1 - 对于大多数用途来说它足够好)。 LTO4驱动器和更高版本通常内置AES-256加密引擎,也可以保持这些速度。

这对我的情况来说意味着我需要400%或更好的支持才能认为值得。

类似的考虑适用于LAN。在30Mb / s时,压缩是Gb级网络的一个障碍,问题是是否要在网络或压缩上花费更多......:)