8.4.2 MPI库的实现 |
在Unix系统,在用C所实现的MPI库中,存在各种可能的选项,这里提出最明显的两个。哪一个更好依赖于链接器和编译器是否支持微弱符号。
带有微弱符号的系统
如果编译器和链接器支持微弱的外部字符,那么通过使用#pragma weak,仅要求使用单一库,因此
#pragma weak MPI_Example = PMPI_Example
int PMPI_Example(/* appropriate args */)
{
/* Useful content */
}
这个#pragma weak的效果是将外部符号MPI_Example定义为一个微弱定义。这意味着如果存在该符号的其它定义(例如在剖析库中),链接器将不会抱怨,然而不存在其它定义,那么链接器将使用微弱定义。
不带有微弱符号的系统
如果缺少微弱符号的定义,那么一个可能的解决方法将是使用C宏预处理器,从而,
#ifdef PROFILELIB
# ifdef __STDC__
# define FUNCTION(name) P##name
# else
# define FUNCTION(name) P/**/name
# endif
#else
# define FUNCTION(name) name
#endif
库中每一个用户可见的函数将被声明如下
int FUNCTION(MPI_Example) (/* appropriate args */)
{
/* Useful content */
}
同样的源文件可以被编译而产生库的全部版本,这依赖于PROFILELIB宏符号的状态。
要求标准MPI库以如下的方式建立,即在一次就可获取所包含的MPI库函数。 这是有点令人不愉快的要求,由于它可能意味着每一外部函数不得不从一个外部分离的文件上编译。然而这是必须的,以致剖析函数的作者仅需定义那些它们希望截取的MPI函数,引用由正常MPI库所完成的任何其它函数。因此链接步骤可以象这样
% cc … -lmyprof -lpmpi -lmpi
这里libmyprof.a包含截取一些MPI函数的剖析函数。libpmpi.a包含“轮换名”的MPI函数,并且包含正常的MPI函数定义。
Copyright: NPACT |