文章

PCH

记录学习PCH的过程!

PCH

什么是PCH

PCH文件,全称Precompiled Header文件,即预编译头文件,是一种在C/C++程序编译过程中使用的技术,用于提高编译速度和减少编译时间。预编译头文件通常包含程序中多个源文件共有的头文件,通过预先编译这些头文件,可以在后续的编译过程中直接使用,避免重复编译,从而提高编译效率。

PCH怎么用

  • 1)、创建预编译头文件:
    通常,会选择项目中使用频率高且变化不大的头文件作为预编译头文件,比如:myheader.h,在这个头文件中,可以包含所有其他源文件中会用到的公共头文件。
  • 2)、编译预编译头文件:
    命令如下: g++/clang -c -x c++-header -o mypch.pch myheader.h (简单的头文件预编译,hip的头文件预编译编译选项要更复杂)
  • 3)、使用预编译头文件:
    使用如下命令: clang -c -include-pch myheader.pch -o test.o test.cpp 其中,通过-include-pch使用预先编译好的myheader.pch,注意一定不要包含预编译中的头文件,会报重定义的错(见下文的验证hip程序使用pch的内容)。

hip程序使用pch

参考来源:hip_embed_pch.sh
具体的过程以及命令如下:

1
clang -O3 --hip-path=$HIP_PATH --offload-arch= -nogpulib -isystem $HIP_PATH/include --cuda-device-only -x hip ./hip_pch.h -E >hip_pch.cui
1
cat ./hip_macros.h >> ./hip_pch.cui   //将一些宏定义写入预处理后的hip_pch.cui文件中
1
clang -cc1 -O3 -emit-pch -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-linux-gnu -fcuda-is-device -target-cpu  -fgnuc-version=4.2.1 -o ./hip.pch -x hip-cpp-output - <./hip_pch.cui

这是预编译头文件的内容: image
注释掉源文件中的头文件:
image
按照上述pch编译命令,完成编译后并使用-include-pch将编译后的pch文件添加到源文件的编译过程中。但是编译过程中报以下错误:
image
需要添加编译选项-fno-validate-pch,忽略掉对pch文件的验证。然后继续编译,又报重定义的错误:
image
这是因为预编译的头文件中已经包含了cstdio的头文件,所以需要在源文件中将头文件注释掉:
image
至此编译成功,使用pch前,编译过程的火焰图如下图所示:
image
使用后,如下图所示:
image
能够看到耗时明显降低。

本文由作者按照 CC BY 4.0 进行授权

© dulm. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

浏览量:👀 | 访客数:👦

热门标签