2011-11-30 22 views
4

我在咬牙切齿......如何获取使用gcc编译代码和ARM Cortex A8目标的调用图分析?

我需要在ARM板上进行性能分析,并需要查看调用图。我尝试过使用OProfile,Kernel perf和Google性能工具。所有工作正常,但不输出任何调用图信息。

这使我得出结论,我没有正确编译我的代码。

我编译我的C++代码时使用以下标志:

拱门具体:

-march=armv7-a -mtune=cortex-a8 -mfloat-abi=hard -mfpu=vfpv3 

一般:

-fexceptions -fno-strict-aliasing -D_REENTRANT -Wall -Wextra 

调试(最优化):

-O2 -g -fno-omit-frame-pointer 

我di d很多谷歌搜索,并找到一些相关的主题:

  • libunwind?
  • (asynchronous-)放松桌
  • -mapcs-frame

不过,我并不完全了解这些都连接。有关如何获取通话图表的任何提示?

注意(由于Rian的回答):我有兴趣了解ARM上的某些方法是否以及为什么比x86-64更耗时(与其他方法相比)。它不会帮助在不同的平台上执行此操作(即使我的代码在两者上编译,我都可以在x86-64上执行调用图)。

+0

你确定你想-mfloat-ABI =硬编译?根据我的理解,mfloat-abi = softfp仍然使用NEON,但与现有的二进制文件更兼容,尽管它不如mfloat-abi = hard那么高效。https://wiki.linaro.org/Linaro-arm-hardfloat –

+0

hard应该提高性能,并且我们努力构建我们的整个分配。 –

+0

oprofile取决于内核。你是否重新配置了你的内核来促进分析? – accuya

回答

2

我知道你想对ARM cortex-A8进行性能分析,但是如果你对调用图感兴趣,为什么不编译x86并运行valgrind的callgrind工具并使用kcachegrind检查结果?

这两个架构的调用图应该是相同的,即使它们编译的函数略有不同,函数之间的关系也不应该改变。

没有特殊标志需要:

valgrind --tool=callgrind -v --dump-every-bb=10000000 ./some-app 
kcachegrind & 
+1

我特别感兴趣的是每个函数的累计时间(包括subcalls),所以我可以看到一些使用模式可能会如何影响特定于平台的性能。由于“每次调用链”关系不同,因此很难从一个平台转移到另一个平台。但是你的回答对于那些只想在没有对时间表感兴趣的情况下获得通话图的人给出了很好的建议。 +1 –

相关问题