Skip to content

第 6 章:NCNN 源码解读

NCNN 是一个超级轻量的框架,这意味着在不同平台上编译和使用它的代价是极低的。它很容易理解,也意味着它更灵活,很容易修改自身来适配到不同的场合下。

截至 2025 年 2 月 17 日,NCNN 项目主分支已经接收了 3372 次提交,目前也是比较火热的项目。NCNN 也是比较稳定的框架,这几年来 API 没有什么改动,说明它在设计之初顶层就做的比较好,具有前瞻性,在静态图盛行的 TensorFlow 1.x 时代能设想机具灵活性的框架,足以说明 NCNN 的优秀特征。

NCNN 项目的大致结构如下:

  • .github/ 工作流文件,后面会讲解如何使用 GitHub 进行自动化测试,来验证自定义优化层的健壮性
  • benchmark/ benchmark 是用来推理性能的测试工具
  • cmake/ NCNN 项目的 CMake 文件和依赖的 CMake 文件
  • docs/ 部分文档,但不是很全面
  • examples/ 示例
  • @glslang/ 项目 KhronosGroup/glslang,GL 着色器语言支持,用于编译 Vulkan 编写的部分着色器
  • images/ NCNN 的 Logo,作者手绘哦!
  • python/ 支持生成 Python 包,使用 PyBind11 来导出接口
  • src/ NCNN 源代码
  • tests/ 自动化测试样例
  • toolchains/ 各种不同架构下的 CMake 文件
  • tools/ 各种模型转换和优化工具的源码

NCNN 的核心代码存在于 src/ 上,所以我们下面只讲解 src/ 下面的内容。

src/ 内只有一个文件夹 layer/ 包含各种层(算子)的实现,其中 layer/ 内直接包含的文件是各种算子的基础实现,也就是没有使用任何加速指令集的、适配各种平台的实现。