PGO 与 CPU 变体
进阶:Profile 引导的 Native 构建。
PGO(profile-guided optimization,基于程序运行记录的优化)和 CPU 多版本编译都用于针对真实工作负载优化 Native 输出。它们需要额外的构建步骤;一般程序和入门教程不需要启用。
用程序运行记录优化可执行文件#
对于不带参数的 main,ckc pgo build 会先生成记录程序运行情况的临时版本,运行一次并收集数据,然后据此构建最终的 O3 可执行文件:
ckc pgo build app.ck --out app-pgo --profile-out app.ckprof
ckc pgo inspect app.ckprof
收集记录时,应运行接近实际使用情况的工作负载。记录能帮助编译器比较优化选择的预期收益,但不能证明某个内存访问或计算改写一定正确。使用前 CK 会核对编译器、源码、目标和模式等身份信息。
库的记录流程#
Native 库会把每次运行产生的已完成记录片段(profile shard)写入目录。所有训练调用结束后,宿主程序还需要调用生成的 ck_profile_flush_* 函数,确保记录写完;随后才能合并记录并用于下一次构建。
ckc build kernel.ck --kind dynamic --pgo-generate profiles/ --out libkernel
ckc pgo merge profiles/ --out kernel.ckprof
ckc build kernel.ck --kind dynamic --pgo-use kernel.ckprof --out libkernel-pgo
宿主程序必须在第一条和第二条命令之间运行训练库并调用生成的 flush 函数。
CPU 多版本编译#
--cpu multiversion 会同时生成一个较通用的基础版本,以及若干适用于当前支持处理器的优化版本。程序启动时会选择当前处理器支持的版本。公共调用接口保持一致,调用方不需要自己判断 CPU 型号。
ckc build kernel.ck --kind static --cpu multiversion --out libkernel.a
多版本编译只支持 O3,不能用于单独的 object 输出。PGO 记录可在 O2 或 O3 时使用;PGO 专门化及多版本编译要求 O3。目前不支持离线 Auto-Tuning。完整选项组合见命令行规范。
链接到仓库的完整参考文档以 main 分支为准,可能包含尚未进入最新下载版本的功能。