上一节简单介绍了代码生成的逻辑,并且通过一个例子来进行了代码生成的演示。
在本项目C++实现的 resnet50 中,也是通过上述的代码生成逻辑来完成的,代码在:cv_learning_from_scratch: AI 视觉入门、从零手写 resnet50 - Gitee.com
resnet50 的代码生成思路为:
1. 先预先运行一遍模型,在核心计算函数的地方,通过输出字符串的形式,将关键信息(如内存地址、一些层的参数)作为确定值固定下来,然后构造相关算法逻辑的字符串流,输出到文本文件中。
2. 生成的所有代码存放在 5th_codegen/ 下的 codegen 目录下。
3. 程序运行(执行 ./resnet) 时会进行 jit 编译,调用相关编译命令对生成的代码文本进行编译,编译成动态库。
4. main 函数中加载该动态库中的关键推理函数,执行推理计算。
本节先介绍上述1,2步骤,即通过字符串输出的形式来输出核心计算逻辑。
由于涉及的代码生成的地方过多,这里不一一详
本文详细阐述了如何使用C++实现ResNet50模型,并通过代码生成逻辑来提高性能。首先,预运行模型并记录关键信息,然后将计算逻辑输出到文本文件,生成的代码存放在5th_codegen/codegen目录下。卷积操作作为示例,展示了代码生成过程,包括write函数的使用和MyConv2d函数中的字符串输出。执行./compile.sh脚本进行编译,传入0参数仅生成代码。生成的代码更简洁,减少了不必要的计算和分支预测开销。下节将讨论JIT编译这些生成的文本文件。
订阅专栏 解锁全文
472

被折叠的 条评论
为什么被折叠?



