我使用LD_PRELOAD用我自己的函数覆盖MPI_Send函数,以便对MPI_send函数进行一些调试。
下面是myMPI_Send. c代码:
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
#include <mpi.h>
#include <stdlib.h>
int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
{
int (*original_MPI_Send)(const void *, int, MPI_Datatype, int, int, MPI_Comm);
original_MPI_Send=dlsym(RTLD_NEXT, "MPI_Send");
printf(" Calling MPI_Send ************** \n");
return (*original_MPI_Send)(buf, count, datatype, dest, tag, comm);
}
在我的项目中,我使用了一个包含MPI_Send函数的extern库。我需要调试extern库,以了解MPI_Send的每次调用的行数和调用次数。
我尝试使用宏来使用此代码:
fprintf (stderr,"MPI_Send, func <%s>, file %s, line %d, count %d\n",__func__, __FILE__, __LINE__, __COUNTER__);
但是,它不起作用,它总是在myMPI_Send.so中打印MPI_Send行。
你能帮我一下吗?先谢谢你。
1条答案
按热度按时间gajydyqb1#
MPI通过MPI分析接口(又称PMPI)满足您的大部分需求。
只需重新定义所需的
MPI_*
子例程,并让它们调用原始的PMPI_*
对应子例程。在您的情况下:
由于您希望打印调用方的行和文件,因此可能必须使用宏并重新构建应用: