有没有人知道一个利用 NVIDIA 的 CUDA 库实现标准压缩方法(例如 Zip、GZip、BZip2、LZMA 等)的项目?
我在想,那些可以利用大量并行任务(如压缩)的算法是否比双核或四核 CPU 更快地在显卡上运行。
你认为这种方法的利弊如何?
有没有人知道一个利用 NVIDIA 的 CUDA 库实现标准压缩方法(例如 Zip、GZip、BZip2、LZMA 等)的项目?
我在想,那些可以利用大量并行任务(如压缩)的算法是否比双核或四核 CPU 更快地在显卡上运行。
你认为这种方法的利弊如何?
我们已完成提高无损数据压缩算法性能的第一阶段研究。我们选择了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
目前没有听说过有人这样做并公开发布。仅个人意见,这听起来并不是很有前途。
正如Martinus所指出的,一些压缩算法高度串行化。像LZW这样的块压缩算法可以通过独立编码每个块来并行化。将大量文件树压缩成Zip文件可以在文件级别上并行处理。
然而,这些都不是真正的SIMD风格并行处理(单指令多数据),也不是大规模并行处理。
GPU基本上是向量处理器,可以同时执行数百或数千个ADD指令,并执行程序时几乎没有数据相关分支。
总的来说,压缩算法更像是SPMD(单程序多数据)或MIMD(多程序多数据)编程模型,更适合于多核CPU。
视频压缩算法可以通过GPGPU处理(如CUDA)加速,只要有大量像素块需要进行余弦变换或卷积(用于运动检测),并且IDCT或卷积子程序可以用无分支代码表示。
GPU也喜欢具有高数值密集度(数学运算与内存访问比率)的算法。数值密集度低的算法(例如向量相加)可以进行大规模并行和SIMD处理,但仍然比CPU运行慢,因为它们受到内存限制。
通常压缩算法无法利用并行任务,很难使算法高度并行化。在您的示例中,TAR不是一种压缩算法,而唯一可能高度并行化的算法是BZIP,因为它是一种块压缩算法。每个块可以分别压缩,但这将需要大量的内存。LZMA也不能并行工作,当您看到7zip使用多个线程时,这是因为7zip将数据流分成2个不同的流,每个流都在单独的线程中使用LZMA进行压缩,因此压缩算法本身并不是并行的。此拆分仅在数据允许的情况下起作用。
加密算法在这个领域非常成功,因此您可能想要研究一下。这里有一篇与CUDA和AES加密相关的论文:http://www.manavski.com/downloads/PID505889.pdf
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级网络的速度,问题是是否在网络或压缩上花更多的钱... :)