c-如何比较MPI代码的两个部分的运行时



我有一个赋值,用两种方式将矩阵与向量相乘。第一个是按列的,第二个是按行的。我在不同的cpp文件中实现了它们,现在我想将它们组合到同一个文件中。我试着这样做:

int main(int argc,char **argv) 
{
int myId, Numofpoc,
MPI_Init(&argc, &argv); 
MPI_Comm_size(MPI_COMM_WORLD, &Numofpoc);       
MPI_Comm_rank(MPI_COMM_WORLD, &myId);
// here column wise code 
MPI_Finalize();
MPI_Init(&argc, &argv); 
MPI_Comm_size(MPI_COMM_WORLD, &Numofpoc);       
MPI_Comm_rank(MPI_COMM_WORLD, &myId);
// here row wise code 
MPI_Finalize();
//then here I compare the time of each way
}

然而,当我从命令行运行它时,按列打印的输出成功,但按行打印使程序停止工作。如果有人知道这个问题的解决方案,或者我如何在MPI中创建2个区域,你能帮我吗?

MPI不允许在单个应用程序中对MPI_INITMPI_FINALIZE进行多个调用。这些调用只是为了让MPI库有机会通过设置内部数据结构、连接等来初始化自己。多次调用函数只会导致事情发生奇怪的情况,因为数据结构/连接已经设置了一次。

您不需要担心应用程序的多个部分相互干扰。只要你正确地匹配你的发送和接收,就没有理由让来自程序一个部分的通信与来自另一部分的通信混合在一起。无论如何,您都应该这样做,因为发送多于接收是无效的代码,反之亦然。

此外,有一件事你在问题正文中从未真正解决过,那就是你在标题中问了什么:"你如何对MPI代码的两个部分进行计时"。MPI提供了函数MPI_WTIME,它为您提供了一种简单、可移植的方法来获取时间戳,您可以使用该时间戳对不同的代码块进行计时。你可以这样使用它:

int main(int argc,char **argv) 
{
int myId, Numofpoc;
double start, stop, column_time, row_time;
MPI_Init(&argc, &argv); 
MPI_Comm_size(MPI_COMM_WORLD, &Numofpoc);       
MPI_Comm_rank(MPI_COMM_WORLD, &myId);
start = MPI_Wtime();
// here column wise code
stop = MPI_Wtime();
column_time = stop - start;
start = MPI_Wtime();
// here row wise code
stop = MPI_Wtime();
row_time = stop - start;
//then here I compare the time of each way
MPI_Finalize();
}

相关内容

最新更新