有没有人知道一个使用NVIDIA的CUDA库实现标准压缩方法(如Zip,GZip,BZip2,LZMA ......)的项目?
我想知道是否能够利用大量并行任务(如压缩)的算法在显卡上的运行速度要比使用双核或四核CPU快得多.
您如何看待这种方法的优缺点?
我们已经完成了第一阶段的研究,以提高无损数据压缩算法的性能.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
不知道有人这样做并公之于众.只是恕我直言,这听起来不是很有希望.
正如Martinus所指出的,一些压缩算法是高度串行的.像LZW这样的块压缩算法可以通过独立编码每个块来并行化.Ziping大型文件树可以在文件级并行化.
然而,这些都不是SIMD风格的并行性(单指令多数据),并且它们不是大规模并行的.
GPU基本上是矢量处理器,您可以在锁定步骤中执行数百或数千个ADD指令,并执行几乎没有数据相关分支的程序.
一般来说,压缩算法更像是SPMD(单程序多数据)或MIMD(多指令多数据)编程模型,它更适合于多核cpu.
视频压缩算法可以通过像CUDA这样的GPGPU处理来加速,只要有大量的像素块被并行地进行余弦变换或卷积(用于运动检测),并且可以表达IDCT或卷积子程序.无分支代码.
GPU也喜欢具有高数值强度(数学运算与内存访问的比率)的算法.数值强度较低的算法(如添加两个向量)可以大规模并行和SIMD,但在gpu上运行速度仍然比cpu慢,因为它们记忆受限了.
通常,压缩算法不能使用并行任务,要使算法高度并行化并不容易.在您的示例中,TAR不是压缩算法,并且唯一可以高度并行化的算法是BZIP,因为它是块压缩算法.每个块都可以单独压缩,但这需要大量的内存.当你看到使用多个线程的7zip时,LZMA也不能并行工作,这是因为7zip将数据流拆分为2个不同的流,每个流都在一个单独的线程中用LZMA压缩,因此压缩算法本身并不是平行的.这种拆分仅在数据允许时才有效.