【发布时间】:2017-10-14 21:51:31
【问题描述】:
在 MPI 中是否有任何方法可以获取我的整个 MPI 程序在 C 中传输的总字节数?
【问题讨论】:
-
您是否考虑过使用外部工具和/或分析库?像 ITAC 或 MPIP 之类的东西
标签: c parallel-processing mpi distributed-computing
在 MPI 中是否有任何方法可以获取我的整个 MPI 程序在 C 中传输的总字节数?
【问题讨论】:
标签: c parallel-processing mpi distributed-computing
最好的方法是使用 MPI 分析工具,例如简单的mpiP。还有更复杂/重量级的工具也可以做到这一点,例如 Score-P。如果您在 HPC 站点上运行代码,您应该检查是否有可用的东西。
【讨论】:
不是我直接知道的,但您可以根据您的目的调整以下代码:
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_recv 没有任何意义。但是,您可能仍然会发现它很有用,因为它允许您使用例如My_MPI_Recv 代码中的任何位置,无需修改字节数。