-g 标志更改程序的运行时和编译
Posted
技术标签:
【中文标题】-g 标志更改程序的运行时和编译【英文标题】:-g flag changes runtime and compilation of program 【发布时间】:2014-05-22 13:43:19 【问题描述】:我正在编写一个程序,尝试使用 SSE 和 AVX SIMD 指令加速 Top K 过滤算法。 我正在使用带有标志 -o3、-msse3 和 -lrt 的 icc 编译我的程序,运行时间约为 30 毫秒。但是,当我在末尾添加 -g 标志以使用 vtune 或 gdb 时,程序运行所需的时间会跳到 ~ 100 毫秒。
有人可以解释为什么会发生这种情况吗?我很困惑为什么 -g 会改变程序的编译。
【问题讨论】:
你如何衡量执行时间? 我认为是-O3
(大写字母)?否则,icc 默认为 -O2,除非存在 -g,在这种情况下,它默认为 -O0。
【参考方案1】:
-g
与其他优化标志如-O3
(与默认的-O0
相对)通常会增加可执行文件的大小,保留符号名称、类型信息、行号等,而不是必然会影响优化的代码。这种代码大小的增加,以及程序的符号/加载时间可能会增加。
这个额外的调试数据可以用strip [options] program
剥离。
请注意,使用具有更高优化值的-g
可能会导致调试器尝试逐步执行不存在的变量 - 因为它们已被优化掉。产生令人困惑的结果。这并不是说这个功能没有用。许多代码(包)默认使用-g -O2
编译,为用户提供一些调试潜力,或在需要优化可执行文件/库时进行剥离。
【讨论】:
通常,额外的调试数据应该在文件的单独部分中(甚至可以在不同的文件中),因此它不应该真正影响运行时发生的事情。一些编译器(显然包括 icc)确实改变了一些东西,比如用 -g 保持帧指针。以上是关于-g 标志更改程序的运行时和编译的主要内容,如果未能解决你的问题,请参考以下文章