1. 开源闭源情况
准确来说,nvCOMP 曾经开源,但从 2.3 版本开始,它已经转为闭源库了 。
2.2.0 还是开源的。
🔍 分水岭:2.3 版本
根据多个信息源,这个变化是明确且公开的:
- 官方公告 :nvCOMP 的说明文档中明确指出,从 2.3 版本开始,压缩和解压缩的核心源代码将不再公开。
- 社区共识:在 Spack 等开源包管理器的记录中,也明确提到在 NVIDIA 将 nvCOMP 闭源后,最后一个开源版本被保留。
📦 现在的 nvCOMP
目前能获取和使用的最新的 nvCOMP 是一个闭源的二进制发行版。
获取方式和使用方面的关键点如下:
- 获取方式 :需要从 NVIDIA 的官方网站下载预编译的二进制包(如
.so或.dll文件)。你仍然可以在 GitHub 上找到它的仓库,但那主要是用于存放文档、示例代码和性能测试工具(Benchmark)的源码,而非库本身的核心代码。 - 许可证限制:作为闭源库,它的使用受 NVIDIA 的最终用户许可协议(EULA)约束。协议中明确禁止对 SDK 进行反向工程、反编译或拆解。
2. 原理概述
nvCOMP的API设计围绕易用性 、算法可交换性 和极致性能这三个核心目标展开。其精髓在于分层设计:为普通用户提供简化的高级接口,为追求极致性能的专家提供底层的设备端扩展(nvCOMPDx)。
🧱 分层API架构
nvCOMP主要提供两种层次的API,以适应不同开发需求:
-
高级C++ API (High-Level C++ API) :这是最常用的接口,旨在简化开发流程。它通过
nvcompManager类层次结构自动管理复杂的资源(如内部临时缓冲区scratch buffer)和任务调度(如将大块数据拆分为多个小块以充分利用GPU并行性)。用户只需要配置好压缩器(如LZ4Manager,GdeflateManager),调用configure_compression和compress/decompress方法即可。此外,它还支持便捷的数据校验和功能。 -
设备端扩展API (nvCOMPDx):这是为追求极致性能和**内核融合(Kernel Fusion)**设计的底层API,用以取代旧版设备端API。它允许你在自己编写的CUDA内核中,直接调用nvCOMP的压缩/解压缩功能(作为设备函数)。其核心执行模型分为两种粒度:
- Warp级执行 (Warp Execution):一个Warp内的所有线程协同处理一个数据块。
- Block级执行 (Block Execution):一个线程块内的所有线程协同处理一个数据块。
这种设计可以将压缩/解压缩与其他计算逻辑融合在同一个内核中,从而减少全局内存的读写,显著降低延迟。它通过定义操作符(Operator)并提供
execute()函数来实现功能。
🧠 核心设计原理
-
算法统一与可交换:无论是高级API还是nvCOMPDx,都设计了一套通用的接口模式。这使得开发者可以在LZ4、GDeflate、ANS等不同算法间轻松切换,以最少的代码改动来寻找针对特定数据集的最佳性能方案。
-
分块处理与并行化 :为了最大限度地利用GPU的大规模并行能力,API在设计上普遍采用分块 策略。在压缩时,输入缓冲区会被分割成多个独立的"块"(Chunk)进行并行处理。
uncomp_chunk_size是一个关键参数,在块大小和压缩比之间需要权衡。 -
可组合的级联压缩 (Cascaded Compression) :nvCOMP提供了一种灵活的"级联"压缩方案,它允许用户组合使用游程编码(RLE) 、**增量编码(Delta Encoding)和位打包(Bit-packing)**等基本压缩单元,构建出更适合特定数据模式的压缩流程。
-
异步执行与流:nvCOMP的API是异步的,所有GPU操作都可以通过传入**CUDA流(CUDA Stream)**来执行,允许压缩/解压缩操作与GPU上的其他计算任务重叠,提升整体效率。
-
硬件加速集成 (Blackwell架构) :从Blackwell架构开始,nvCOMP的API能够无缝利用新的硬件解压缩引擎(Decompression Engine, DE),以硬件速度加速LZ4、Snappy等格式的解压。其设计的巧妙之处在于,开发者无需修改代码,当运行在不支持DE的GPU上时,nvCOMP会自动回退到软件实现,保证了代码的可移植性。
💻 语言支持概览
| 编程语言 | 主要API层级 | 关键特性 |
|---|---|---|
| C++ | 高级API (Manager类) & nvCOMPDx | 功能最完整,提供最大的灵活性和性能控制。 |
| C | 批处理API | 提供底层的批量压缩/解压缩接口。 |
| Python | 高级API封装 | 提供Codec类和Array对象,使用方便,与Numpy/CUDA Array接口兼容良好。 |