【问题标题】:Generate data communication flow graph (C program, profiling) [closed]生成数据通信流图(C 程序,分析)[关闭]
【发布时间】:2014-01-10 18:10:42
【问题描述】:

我希望能够生成一个通信/调用图,其中包含有关函数之间传递的数据量的信息。

例如:

function1() -----> [Object *ptr] ----> function2()

这意味着函数 1 将指向对象的指针传递给函数 2(反之亦然)。但是,如果 *ptr 指向一个 1MB 的对象(比如说)。那么图表应该看起来像:

function1() ----> [Object *ptr::1MB] -----> function2()

这将使我们大致了解如何(以及数据的类型/大小/格式)传递。看起来像:

  1. http://cms.uni-kassel.de/unicms/uploads/pics/TASK_GRAPH_01.JPG
  2. http://www.prace-ri.eu/IMG/png/gprof.png

我可以通过使用 gprof 分析和 gprof2dot 脚本获得类似 (2) 的图形,但它的输出仅显示 cpu 使用百分比。我也想看看它们之间传递的数据量。

是否有可以提供此信息的工具(开源/商业),或者您是否知道可用于获取此信息的工具组合?

(我正在考虑结合 Valgrind + gprof 的分析,但想知道是否有更直接的方法..

非常感谢!

【问题讨论】:

  • 问题是指针(在 C 中)你不知道它们指向的大小。 'int *' 可能是 0、1、5、100 或 1500000 的数组。如果它是 void *,则所有赌注都关闭。我不知道有任何程序化的方式来做到这一点。
  • 我会为此使用graphviz。

标签: c memory profiling code-analysis callstack


【解决方案1】:

您需要一个处理函数指针的调用图。

使用它,您需要识别数据流,例如调用图元素之间传递的值。对于标量值,标量的大小非常明显。对于指针值来说,pointer的大小可能比较明显,但是流向被调用函数的数据量是什么指针被解引用,多少数据被解引用处理的问题。为此,如果您有一个“指向 T 的指针”并且该指针被引用以获取“整个值”,那么您需要的大小是 sizeof(T)。如果 T 是复合类型,“p->q”的访问大小为 T.q。因此,如果您想静态收集这些数据,则需要程序中的所有类型信息。

为此,您需要一个 C 解析器、名称和类型解析、控制和数据流分析。你不能用“只是一个 C 解析器”来做到这一点。

您可以使用 GCC 或 Clang 或使用我们的 DMS 等工具来获取此信息。我认为从 GCC 获取这些信息并不容易。它被设计为编译器,而不是分析工具。 Clang 听起来更容易使用(我没有亲身经历); DMS 专为此类任务而设计,但人们的意见可能会有所不同。

您还需要能够构建调用图,然后重新遍历每个模块的数据流。我认为这对 GCC 来说很难。它想一次只编译一个编译单元。我认为 Clang 可以一次处理多个编译单元。 DMS 可以,而且我们已经为 2600 万行的单次加载图像构建了带有点分析的调用图。

无论您选择哪种方式,设置工具以提取您想要的内容都是一项相当公平的练习。 [你会怎么处理答案?]

【讨论】:

  • 获得的数据将用于与另一个调用图合并,以形成功能通信数据流。一种建立应用程序模型的方法,其中包括应用程序的资源使用情况(例如内存、cpu、通信通道 - 在 MPSoC 中)。可能考虑将不同的功能映射到片上网络中的不同核心上,因此我们需要知道数据量。
  • 您可能会喜欢我关于“机械地将遗留应用程序转换为网络应用程序”的论文,它基本上就是这样做的。见 NetCentric 会议第 12 页:netcentriccomputing.org/2001/NCC2001.pdf
  • 谢谢!知道本文中提到的“DMS 软件再工程工具包”是否可以免费使用(用于学术研究目的?)
  • 对学者来说不是免费的,但有很大的折扣。联系公司。
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
相关资源
最近更新 更多