【问题标题】:Getting number of total MPI bytes transferred by a program获取程序传输的总 MPI 字节数
【发布时间】:2017-10-14 21:51:31
【问题描述】:

在 MPI 中是否有任何方法可以获取我的整个 MPI 程序在 C 中传输的总字节数?

【问题讨论】:

  • 您是否考虑过使用外部工具和/或分析库?像 ITAC 或 MPIP 之类的东西

标签: c parallel-processing mpi distributed-computing


【解决方案1】:

最好的方法是使用 MPI 分析工具,例如简单的mpiP。还有更复杂/重量级的工具也可以做到这一点,例如 Score-P。如果您在 HPC 站点上运行代码,您应该检查是否有可用的东西。

【讨论】:

    【解决方案2】:

    不是我直接知道的,但您可以根据您的目的调整以下代码:

    uint64_t bytes_recv = 0;
    
    void CommRecv(MyObject* a){
      MPI_Status status;
    
      MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
    
      int msg_size;
      MPI_Get_count(&status, MPI_BYTE, &msg_size);
      bytes_recv += msg_size;
    
      // Allocate a buffer to hold the incoming data
      char* buf = (char*)malloc(msg_size);
      assert(buf!=NULL);
    
      MPI_Recv(buf, msg_size, MPI_BYTE, from, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    
      //Do stuff
    
      free(buf);
    }
    

    这里的重点是将标准 MPI 通信函数与跟踪数据传输统计的函数封装起来。在内部,这些函数使用MPI_Get_count() 来检索传入消息的大小。然后将其添加到跟踪所有封装 MPI 函数的通信的全局变量中。

    在程序结束时,您可以在主进程上累积每个实例的全局变量。

    【讨论】:

    • 嗨,我是 MPI 编程的新手,但我认为只有 bytes_recv 才能胜任我的工作。我不需要额外的 MPI_recv 或它做任何重要的事情。
    • 不,额外的MPI_recv 没有任何意义。但是,您可能仍然会发现它很有用,因为它允许您使用例如My_MPI_Recv 代码中的任何位置,无需修改字节数。
    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多