【问题标题】:Calculating CPU Time when using MPI使用 MPI 时计算 CPU 时间
【发布时间】:2016-04-06 10:06:26
【问题描述】:

我正在研究 MPI 中的并行矩阵-矩阵乘法器。我已经完成了计算部分,但我也想计算 CPU 时间。我被卡住了,因为看起来有些进程报告的开始和结束时间为 0,而对于一个应该在一秒钟内完成的任务(小矩阵),程序报告了 1000+ 秒的 CPU 时间(即使我知道它运行从观察不到一秒钟)。这是我目前正在做的事情:

#include <time.h>
#include "mpi.h"
// other includes
int main()
{
    int start, end, min_start, min_end;
    if (rank == 0)
    {
        // setup stuff

        start = clock();
        MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

        // master computation stuff

        end = clock();
        MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);

        cout << "CPU time was " 
             << (double)(max_end - min_start) / CLOCKS_PER_SEC 
             << " seconds" << endl;
    }   
    else if (rank != 0)
    {
        // setup stuff

        start = clock();
        MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

        // slave computation stuff

        end = clock();
        MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
    }
}

我不确定错误的根源是什么。当我在这个调试输出中添加时(在if (rank == 0)else if (rank != 0) 语句之后)

MPI_Barrier(MPI_COMM_WORLD);
for (int i=0; i<size; i++)
{
    if (rank == i)
        cout << "(" << i << ") CPU time = " 
             << end << " - " << start 
             << " = " << end - start << endl;
    MPI_Barrier(MPI_COMM_WORLD);
}

我得到以下输出

CPU time was 1627.91 seconds
(1) CPU time = 0 - 0 = 0
(2) CPU time = 0 - 0 = 0
(0) CPU time = 1627938704 - 32637 = 1627906067
(3) CPU time = 10000 - 0 = 10000

【问题讨论】:

  • 首先,我根本不会使用clock()。您可以将 chrono 与 C++11 一起使用,或者在 C++11 之前使用它的 Boost 实现。

标签: c++ parallel-processing mpi cpu-time


【解决方案1】:

首先,man 3 clock 说“clock() 函数返回程序使用的处理器时间的近似值”。所以要确定时间你不需要计算差异。这种误解是错误的根源。你只需要在你密集的计算之后调用它,而忽略setup stuff所消耗的时间。

如果您不想考虑设置时间,那么您确实需要区别。因此,只需使用简单而强大的 MPI_Wtime 函数即可获取自过去某个固定时刻以来的精确秒数。

从最大结束时间减去最小开始时间得到的值并不是普遍接受的 CPU 时间(即time 实用程序)。那个时间是real 时间。要获得真正的 CPU 时间,您应该总结所有处理时间,即使用时间差调用 MPI_ReduceMPI_SUM 操作。

【讨论】:

  • 既然MPI_Wtime给出的是wall time而不是CPU time,那么如果集群上也有其他作业在运行,那么报告的时间会增加,对吧?我的目标是能够计算从串行执行到并行执行的加速。
  • @RagingRoosevelt 串行执行的加速应计算为 1 台机器上的挂墙时间与 N 台机器上的挂墙时间相比。 CPU 时间不计入该计算
  • 除了@NoseKnowsAll 所说的,测量 CPU 时间是没有用的。大多数 MPI 实现会产生额外的线程来处理网络请求,如果它们中的任何一个在轮询数据时旋转,clock() 报告的整体 CPU 时间将会飙升。此外,clock() 是高度不可移植的,例如它返回 Windows 上的实时时间。
  • 很遗憾听到这个消息。我的教授对我们应该如何使用时钟时间而不是挂钟时间进行了长时间的闲逛,因为当其他进程被安排并且我的工作处于空闲状态时,挂钟时间就会增加。对我来说,MPI_Wtime 也很有意义。
猜你喜欢
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多