为什么我的代码在编译用于分析(-pg)时使用多个线程比使用单个线程运行得慢?

flu*_*els 2 linux performance multithreading gcc gprof

我正在写一个光线追踪器.

最近,我添加了线程到程序,以利用我的i5四核上的额外内核.

在一个奇怪的事件发生时,应用程序的调试版本现在运行得更慢,但优化的构建运行速度比我添加线程之前更快.

我将"-g -pg"标志传递给gcc用于调试构建,并将"-O3"标志传递给优化构建.

主机系统:Ubuntu Linux 10.4 AMD64.

我知道调试符号会给程序带来很大的开销,但始终保持相对性能.即,更快的算法将始终在调试和优化构建中运行得更快.

知道为什么我看到这种行为吗?

调试版本使用"-g3 -pg"编译.带"-O3"的优化版本.

Optimized no threading:        0m4.864s
Optimized threading:           0m2.075s

Debug no threading:            0m30.351s
Debug threading:               0m39.860s
Debug threading after "strip": 0m39.767s

Debug no threading (no-pg):    0m10.428s
Debug threading (no-pg):       0m4.045s
Run Code Online (Sandbox Code Playgroud)

这使我确信"-g3"不应该归咎于奇怪的性能增量,但它更像是"-pg"开关."-pg"选项可能会添加某种锁定机制来测量线程性能.

因为无论如何"-pg"在线程应用程序上被破坏了,我只是删除它.

caf*_*caf 8

没有-pg国旗你会得到什么?这不是调试符号(不影响代码生成),而是用于分析(这样做).

在多线程进程中进行概要分析需要额外的锁定,从而减慢多线程版本的速度,甚至达到使其比非多线程版本慢的程度,这是非常合理的.

  • -pg启用gprof分析,并且如答案所示,将减慢代码速度. (2认同)