是否有人知道使用NVIDIA的CUDA library实现标准压缩方法(如Zip,GZip,BZip2,LZMA等)的项目?
我想知道可以使用大量并行任务(如压缩)的算法在显卡上的运行速度是否比双核或四核CPU快得多。
您如何看待这种方法的利弊?
答案 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级网络的一个障碍,问题是是否要在网络或压缩上花费更多......:)