Debugging 如何在外部进程中调试MPI函数(MPICH)?

Debugging 如何在外部进程中调试MPI函数(MPICH)?,debugging,mpi,mpich,Debugging,Mpi,Mpich,我正在用其他方法替换在MPI函数中工作的POSIX,但是在调试外部进程时遇到了问题。 我正在更改MPI库(hydra)中来自utils/sock/sock.c的函数 例如,当我尝试使用node1和node2运行下面的测试源代码时,我可以看到启动了两个主要进程,一个在node1中运行,另一个在node2中运行 int main(int argc, char** argv) { // Initialize the MPI environment MPI_Init(NULL, NULL);

我正在用其他方法替换在MPI函数中工作的POSIX,但是在调试外部进程时遇到了问题。 我正在更改MPI库(hydra)中来自utils/sock/sock.c的函数

例如,当我尝试使用node1和node2运行下面的测试源代码时,我可以看到启动了两个主要进程,一个在node1中运行,另一个在node2中运行

int main(int argc, char** argv) {
  // Initialize the MPI environment
  MPI_Init(NULL, NULL);
  // Find out rank, size
  int world_rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
  int world_size;
  MPI_Comm_size(MPI_COMM_WORLD, &world_size);

  // We are assuming at least 2 processes for this task
  if (world_size < 2) {
    fprintf(stderr, "World size must be greater than 1 for %s\n", argv[0]);
    MPI_Abort(MPI_COMM_WORLD, 1);
  }

  int number;
  if (world_rank == 0) {
    // If we are rank 0, set the number to -1 and send it to process 1
    number = -1;
    MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
  } else if (world_rank == 1) {
    MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Process 1 received number %d from process 0\n", number);
  }
  MPI_Finalize();
}
int main(int argc,char**argv){
//初始化MPI环境
MPI_Init(NULL,NULL);
//找出等级、大小
国际世界排名;
MPI通信等级(MPI通信世界级和世界级);
国际大世界;
MPI_Comm_大小(MPI_Comm_WORLD和WORLD_大小);
//我们假设此任务至少有两个进程
如果(世界大小<2){
fprintf(stderr,“对于%s\n,世界大小必须大于1”,argv[0]);
MPI_中止(MPI_通信世界,1);
}
整数;
如果(世界排名==0){
//如果排名为0,则将数字设置为-1并将其发送到进程1
数字=-1;
MPI_发送(&number,1,MPI_INT,1,0,MPI_COMM_WORLD);
}else if(世界排名==1){
MPI_Recv(&number,1,MPI_INT,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
printf(“进程1从进程0接收到编号%d”,编号);
}
MPI_Finalize();
}
问题是我可以调试node1中的第一个进程,并且成功地更改了MPI函数中的所有源代码。但是,我不知道如何调试在node2(外部主机)中运行的第二个进程

我的问题是。。
有没有一种好方法可以调试在外部主机中运行的第二个进程?我尝试了printf函数,但它也只在第一个进程中运行,该进程在node1中运行,在node2中没有显示任何内容

这就是并行调试器的用途!DDT或TotalView可以做到这一点,但这些都是商业软件。感谢您的回复,是否有任何调试模式用于监视在外部服务器上运行的进程?因为我只看到用于检查内部主机中运行的多个线程的功能,而不是外部线程。我只使用DDT,只需告诉调试器这是一个MPI应用程序,它将在
MPI_Init()
完成后自动附加所有任务。您甚至没有提到平台,因此我无法给出一个好的具体答案。一般情况下:转到外部主机并将调试器附加到MPI进程。
int main(int argc, char** argv) {
  // Initialize the MPI environment
  MPI_Init(NULL, NULL);
  // Find out rank, size
  int world_rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
  int world_size;
  MPI_Comm_size(MPI_COMM_WORLD, &world_size);

  // We are assuming at least 2 processes for this task
  if (world_size < 2) {
    fprintf(stderr, "World size must be greater than 1 for %s\n", argv[0]);
    MPI_Abort(MPI_COMM_WORLD, 1);
  }

  int number;
  if (world_rank == 0) {
    // If we are rank 0, set the number to -1 and send it to process 1
    number = -1;
    MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
  } else if (world_rank == 1) {
    MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Process 1 received number %d from process 0\n", number);
  }
  MPI_Finalize();
}