如何比较MPI代码两部分的运行时间?

时间:2015-04-17 12:13:33

标签: c mpi

我有一个赋值,用2种方式对向量进行矩阵乘法。第一个是列式的,第二个是列式的。我在不同的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个区域,你能帮助我吗?

1 个答案:

答案 0 :(得分:1)

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();
}