我想知道是否有一种方法可以测量运行时MPI调用所花费的时间,这样我就可以用它来计算新的负载平衡。因此,我可以用它来计算一个新的负载平衡。
我知道如何使用OpenMPI或英特尔的一些工具来剖析和跟踪程序,但这些都是在运行后使用的。此外,我已经尝试过FPMPI,这不是一个成功的,因为最后一个版本是无法建立。
测量 "手工 "没有任何意义,在我的应用程序,因为它是大的方式。
首先,你真的需要对MPI这样的低级通信进行剖析吗?你不能简单地给你的高级例程计时吗?
无论如何,编写自己的MPI剖析器是非常容易的。实际上,所有的MPI库(包括Open MPI)都会将他们的函数(例如, MPI_Send
)作为相同函数符号的弱别名,前缀为 P
(如:。PMPI_Send
). 你需要做的就是定义你自己的函数,其原型与MPI库中的函数相同。在里面,更新你的调用计数器,启动定时器,然后调用原来的MPI函数,用一个 P
前缀,并在返回时停止定时器。
extern "C"
int MPI_Send(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm) {
// Update call counters and start the timer
calls["MPI_Send"]++;
timers["MPI_Send"].start();
// Call the original MPI function
int result = PMPI_Send(buf, count, dtype, dest, tag, comm);
// Stop the timer
timers["MPI_Send"].stop();
return result;
}
计时器: extern "C"
部分是很重要的,否则如果你用C++写,你就不会覆盖正确的弱符号。
这种覆盖MPI库中符号的能力是标准化的--见 #14.2 剖析接口 在 现行标准版.