【问题标题】:MPI Total run timeMPI 总运行时间
【发布时间】:2015-10-21 12:40:02
【问题描述】:

我有一个程序(用 cannon 算法计算矩阵乘法),在 C 的 MPI 中实现,我设置了一个时钟来查看该程序的总时间,总时间是指所有进程的总和。

但结果我得到了每个进程的时间。

我的 main 开头的部分代码:

 clock_t begin, end;
 double time_spent;
 begin = clock();

 /* Initializing */
 MPI_Init (&argc, &argv);

然后在我的代码末尾:

  MPI_Finalize();

  end = clock();
  time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  printf("\n\nTIME: %f SECONDS\n\n", time_spent);

【问题讨论】:

    标签: c time parallel-processing mpi clock


    【解决方案1】:

    假设您想要的是每个流程的各个时间的总和,您将需要:

    1. 将通话前的结束时间移至MPI_Finalize(),因为您需要额外的沟通;
    2. 通过MPI_Reduce() 收集各个时间以处理#0(例如);最后
    3. 这次使用进程 0 打印。

    除此之外,除非您有令人信服的理由不这样做,否则我会鼓励您使用 MPI_Wtime() 作为计时器,而不是使用具有误导性的 clock() 计时器。

    代码如下所示:

    int main( int *argc, char* argv[] ) {
        MPI_Init( &argc, &argv );
        double tbeg = MPI_Wtime();
    
        // a lot of stuff here
    
        // you might want a barrier here...
        // MPI_Barrier( MPI_COMM_WORLD );
        double elapsedTime = MPI_Wtime() - tbeg;
        double totalTime;
        MPI_Reduce( &elapsedTime, &totalTime, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD );
        if ( rank == 0 ) {
            printf( "Total time spent in seconds id %f\n", totalTime );
        }
        MPI_Finalize();
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      是的,你得到的当然是正确的。

      如果你想要TOTAL TIME,即每个进程花费的时间总和,然后发送主节点中每个节点的本地time_spent,在那里执行本地time_spent的求和并打印它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-25
        • 2016-12-30
        • 2011-07-14
        • 2011-09-15
        • 1970-01-01
        • 2012-05-21
        • 2019-11-03
        • 1970-01-01
        相关资源
        最近更新 更多