有关使用AVX,EIGEN等加速方法过程中cmake选项的说明
"CMAKE_BUILD_TYPE"的作用
参考cmake_type的博客可以发现这个选项是用来调控最终执行文件的性能的,一般来说有下面的几个模式:
- Release:发布版,开启最高优化,关闭调试信息的开销。
- Debug:调试版,开启调试符号、较少优化,便于调试。
- RelWithDebInfo:折中版,开启优化,同时保留调试信息。
- MinSizeRel:最小化产物大小的构建类型,适合嵌入式/发布包大小敏感场景。
默认情况下 CMAKE_BUILD_TYPE 为空字符串,这时相当于 Debug。
本质上来说,开启release模式会使用-O3等优化手段对程序进行加速
为什么写这个博客
事实上是因为当使用AVX加速指令集,eigen或者GPU CUDA计算等加速方法的时候,"CMAKE_BUILD_TYPE"应当被设置为release模式,不仅仅在于速度方面的考虑,实际上由于计算过程中可能的精度损失,结果也有可能被影响,同一个代码TriH-ANNS在使用Debug和Release两种模式下得到的结果完全不同
$ ./trih/bin/trih_anns gist-960-euclidean-shuffle.hdf5 s gist_128 1000 500 100 128 4 256 16
# release模式
qps = 69802
recall@100: 0.971033
# debug模式
qps = 34496
recall@100: 0.466339
可以发现不仅仅时速度,recall都会受到严重影响(这个项目大量使用了量化方法,极大概率debug模式下出现了严重的精度损失)
使用方法
- 直接写。一般写为下面的格式
cmake -S . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo
- 使用presets(xxx.json)
{"version": 3,"defaultPreset": "default-release","presets": [{"name": "default-release","displayName": "Release (默认)","hidden": false,"generator": "Ninja","description": "使用 Ninja 生成器,默认 Release 构建类型","cacheVariables": {"CMAKE_BUILD_TYPE": "Release"}// 下面的两步可选:如果你使用的是两步构建流程,可在命令中显式调用// "environment": {// "CXXFLAGS": "-O3",// "CFLAGS": "-O3"// }},{"name": "default-debug","displayName": "Debug","hidden": false,"generator": "Ninja","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"}},{"name": "default-relwithdebinfo","displayName": "RelWithDebInfo","hidden": false,"generator": "Ninja","cacheVariables": {"CMAKE_BUILD_TYPE": "RelWithDebInfo"}}]
}
最后,不懂某个选项啥意思建议问ai