获取程序传输的总 MPI 字节数
Getting number of total MPI bytes transferred by a program
在 MPI 中有什么方法可以获取我的整个 C 中的 MPI 程序传输的总字节数?
据我所知,您可以根据自己的目的修改以下代码:
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 分析工具,例如简单的 mpiP。还有更复杂/重量级的工具也可以做到这一点,例如 Score-P。如果您 运行 您的代码在 HPC 站点上,您应该检查是否有可用的东西。
在 MPI 中有什么方法可以获取我的整个 C 中的 MPI 程序传输的总字节数?
据我所知,您可以根据自己的目的修改以下代码:
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 分析工具,例如简单的 mpiP。还有更复杂/重量级的工具也可以做到这一点,例如 Score-P。如果您 运行 您的代码在 HPC 站点上,您应该检查是否有可用的东西。