使用Nvidia的CUDA压缩库
有没有人知道使用NVIDIA的CUDA库实现标准压缩方法(如Zip,GZip,BZip2,LZMA,…)的项目?
我想知道是否可以使用大量并行任务(如压缩)的algorithm在graphics卡上的运行速度不会比使用双核或四核CPU的运行速度快得多。
你怎么看待这种方法的利弊?
没有意识到任何人已经这样做,并公布。 只是恕我直言,这听起来不是很有希望。
正如Martinus指出的,一些压缩algorithm是高度串行的。 像LZW这样的块压缩algorithm可以通过独立编码每个块来并行化。 紫平大文件树可以在文件级别并行化。
但是,这些都不是真正的SIMD式并行(Single Instruction Multiple Data),它们并不是大规模并行的。
GPU基本上是vector处理器,可以在锁步骤中执行数百或数千条ADD指令,并执行那些数据相关分支很less的程序。
一般来说,压缩algorithm听起来更像SPMD(单一程序多数据)或MIMD(多指令多数据)编程模型,它更适合于多核CPU。
video压缩algorithm可以像CUDA那样通过GPGPU处理加速,只有在有很多像素块被余弦变换或者卷积(用于运动检测)的同时,可以表示IDCT或卷积子程序与无分支代码。
GPU也类似于具有高数值强度(math运算与存储器访问的比率)的algorithm。具有低数字强度的algorithm(例如,添加两个向量)可以是大规模并行和SIMD,但是仍然比gpu慢,因为它们重新记忆。
我们已经完成了第一阶段的研究,以提高无损数据压缩algorithm的性能。 selectBzip2作为原型,我们的团队只优化了一个操作 – Burrows-Wheeler转换,我们得到了一些结果:2x-4x加速了良好的可压缩文件。 代码在我们所有的testing中工作得更快。
我们将完成bzip2,支持deflate和LZMA,用于一些真实的生活任务,例如:HTTPstream量和备份压缩。
博客链接: http : //www.wave-access.com/public_en/blog/2011/april/22/breakthrough-in-cuda-data-compression.aspx
通常,压缩algorithm不能使用并行任务,要使algorithm高度可并行化并不容易。 在你的例子中,TAR不是一种压缩algorithm,唯一可能高度并行化的algorithm是BZIP,因为它是块压缩algorithm。 每个块可以分别压缩,但这需要大量的内存。 当你看到7zip使用multithreading的时候,LZMA不能并行工作,这是因为7zip把数据stream分成了两个不同的stream,每个stream在一个单独的线程中用LZMA压缩,所以压缩algorithm本身不是平行的。 这种分裂只有在数据允许的情况下才有效。
encryptionalgorithm在这个领域已经相当成功,所以你可能要考虑一下。 这里是一个关于CUDA和AESencryption的文章: http : //www.manavski.com/downloads/PID505889.pdf
我们正在尝试将bzip2移植到CUDA。 :)到目前为止(只做了粗略的testing),我们的Burrows-Wheeler变换比串行algorithm快30%。 http://bzip2.github.com
30%是好的,但对于像备份这样的应用来说,远远不够。
我的经验是,在这种情况下,平均数据stream使用gzip进行1.2-1.7:1的压缩,最终限制在30-60Mb / s的输出速率(这是跨越现代(大约2010-2012年)高端CPU。
这里的限制通常是数据可以inputCPU本身的速度。
不幸的是,为了使LTO5磁带驱动器保持高兴,它需要160Mb / s左右的原始 (不可压缩)数据速率。 如果馈送可压缩数据,则需要更快的数据速率。
LTO压缩显然要快得多,但效率有点低(相当于gzip -1 – 对于大多数用途来说已经够用了)。 LTO4硬盘和硬盘通常内置AES-256encryption引擎,可以保持这种速度。
这对我的情况意味着我需要一个400%或更好的潜力,才能认为这是值得的。
类似的考虑适用于局域网。 在30Mb / s时,压缩是Gb级networking的障碍,问题在于是否花费更多的时间在networking或压缩上。