8.4.3 复杂情况

BACKWARD FORWARD


多个计数

由于部分MPI库可以用更基本的MPI函数来实现,(例如通过使用点对点通信来实现可移植的集合操作)那么蕴含着从一个MPI函数内部调用的剖析函数,而这个函数又从一个剖析函数中调用。这将导致花费在内部例程的时间的“双重计数”。由于这种效果在某些情况下(例如它允许人们回答问题“当从集合函数调用时在点对点例程中花费多少时间”)实际上是有用的,那么我们不决定对想要克服这个情况的MPI库的作者增加任何限制。所以剖析库的作者应该关注这个问题,并且自己对它进行屏障。在单一线索的世界,通过在剖析代码中使用一个静态变量来很容易地获取它,这个剖析代码记忆你是否已在剖析例程内部。在多线索环境中它变得更复杂。(就象所记录的时间一样的含义)

链接特性

传统上Unix链接器操作一遍:在扫描库的时候,如果需要,这样的效果是仅包含在映象中库中的函数。 当与微弱符号或同样函数的多次定义结合时,这将引起奇异效应(不期望的)。

例如,考虑一个MPI的实现,其中在C实现上使用打包函数来获得Fortran约定。然后剖析函数的作者假定有理由仅提供C约定的剖析函数,因为Fortran将最终调用这些而且假定打包的开销很小。然而,如果打包函数不在剖析库中,那么当剖析函数库被调用时没有剖析入口点不被定义。因此在映象中不包含剖析代码。当扫描标准MPI函数库时,Fortran打包函数被求解,并且也将收入到基本的MPI函数版本中。整体的影响是代码将成功的连接,但不被剖析。

为了克服这个,我们必须确保Fortran打包函数包含在库的剖析版本中。通过要求这些,与基本MPI库的其它部分项分离,我们保证这是可能的。 这允许它们在基本库之外,且在剖析库中。


Copyright: NPACT BACKWARD FORWARD