使用Nvidia的CUDA进行压缩的库

57

有没有人知道一个利用 NVIDIA 的 CUDA 库实现标准压缩方法(例如 Zip、GZip、BZip2、LZMA 等)的项目?

我在想,那些可以利用大量并行任务(如压缩)的算法是否比双核或四核 CPU 更快地在显卡上运行。

你认为这种方法的利弊如何?


CUDAS的内存限制是什么?即4K到32K块对于它来说处理并行数据太多了吗?gzip可以通过不在块之间保存字典来并行压缩,这会使文件大小增加约5%。请参见Dictzip作为示例。 - Erik Johansson
本演示重点介绍Gzip,可以获得大约10倍的加速效果。http://on-demand.gputechconf.com/gtc/2014/presentations/S4459-parallel-lossless-compression-using-gpus.pdf - Ole Tange
https://github.com/adnanozsoy/CUDA_Compression 支持基于lszz的GPU算法,我已经测试了大文件。与bzip2相比,压缩比约为x2,时间消耗约为bzip2的25%。 - ZFY
6个回答

54

我们已完成提高无损数据压缩算法性能的第一阶段研究。我们选择了Bzip2作为原型,优化了Burrows-Wheeler转换这一个操作,取得了一些结果:在易于压缩的文件上,速度提升了2倍至4倍。代码在我们所有测试中都运行更快。

我们打算完成bzip2的开发,支持deflate和LZMA,以应用于一些实际任务,如HTTP流量和备份压缩。

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


2
对于在一年之后跟进这个问题,给你加一分。另外,你的工作看起来很有趣,谢谢。 - eSniff
7
已经过去了4年,我(我们所有人)想更多地了解你的项目。你有什么成果?如果有的话,在哪里可以找到相关资源?期待你的回复。 - Jet
9
Alexander,有任何消息吗?代码在哪里可以获取? - einpoklum
我只是参考了这个网站http://libbsc.com/ ,但这个网站已经死了大约7年了(现在是2019年)。 - Angelos Pikoulas

49

目前没有听说过有人这样做并公开发布。仅个人意见,这听起来并不是很有前途。

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

然而,这些都不是真正的SIMD风格并行处理(单指令多数据),也不是大规模并行处理。

GPU基本上是向量处理器,可以同时执行数百或数千个ADD指令,并执行程序时几乎没有数据相关分支。

总的来说,压缩算法更像是SPMD(单程序多数据)或MIMD(多程序多数据)编程模型,更适合于多核CPU。

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

GPU也喜欢具有高数值密集度(数学运算与内存访问比率)的算法。数值密集度低的算法(例如向量相加)可以进行大规模并行和SIMD处理,但仍然比CPU运行慢,因为它们受到内存限制。


1
我最初想到的并行化是针对“大量文件树”的情况,但你提到的其他原因已经说服了我,谢谢。 - Xn0vv3r
你能提供一些数据来证明,像向量加法这样的内存绑定算法在GPU上运行比在CPU上慢吗? - Benedikt Waldvogel
3
@bene 我的措辞有误。内存受限算法在GPU上运行速度可以一样快甚至更快——大多数GPU具有非常高的内存带宽。无论哪个处理器拥有最高的有效内存带宽,都会更快地执行这些算法。但是,如果你在CPU上采集数据,将其传输到GPU(通常通过PCIE总线),然后进行加法操作,再将数据传输回CPU,这种方式始终会慢得多,而且很容易构建一个基准测试来证明这一点。 - Die in Sente

8

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


2

1
乍一看,似乎加速了每个块的加密。但是需要链接块密码以避免某些类型的攻击,这并没有帮助。http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation - Calyth
确实,这篇论文没有涉及到它,但是在《GPU宝典》中有一篇同事写的关于AES解密与Shafer代码的论文,不是Cuda,但涵盖了链式处理。不幸的是,这篇文章不在网上。无论如何,GPU可以处理链接。 - Robert Gould

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

据我所见,bzip2使用多个CPU核心,但不使用CUDA。链接已经失效。当前的链接似乎是http://www.bzip.org/。 - Eric J.

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%或更好的改进才能考虑它是否值得。

类似的考虑也适用于局域网。在30Mb/s的情况下,压缩会妨碍Gb级网络的速度,问题是是否在网络或压缩上花更多的钱... :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接