第 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/
内直接包含的文件是各种算子的基础实现,也就是没有使用任何加速指令集的、适配各种平台的实现。