使用 MPI 计算 CPU 时间
Calculating CPU Time when using MPI
我正在研究 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
首先,man 3 clock
表示 "the clock() function returns an approximation of processor time used by the program"。因此,确定时间不需要计算差异。这种误解是错误的根源。您只需要在密集计算后调用它,而忽略 setup stuff
.
所消耗的时间
如果您不想考虑设置时间,那么您确实需要差异。因此,只需使用简单而强大的 MPI_Wtime 函数即可获取自过去某个固定时刻以来的精确秒数。
通过从最大结束时间减去最小开始时间得到的值不是普遍接受的术语中的总 CPU 时间(即 time
效用)。那个时间是real
时间。要真正获得 CPU 时间,您应该总结所有处理时间,即调用 MPI_Reduce
时差和 MPI_SUM
操作。
我正在研究 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
首先,man 3 clock
表示 "the clock() function returns an approximation of processor time used by the program"。因此,确定时间不需要计算差异。这种误解是错误的根源。您只需要在密集计算后调用它,而忽略 setup stuff
.
如果您不想考虑设置时间,那么您确实需要差异。因此,只需使用简单而强大的 MPI_Wtime 函数即可获取自过去某个固定时刻以来的精确秒数。
通过从最大结束时间减去最小开始时间得到的值不是普遍接受的术语中的总 CPU 时间(即 time
效用)。那个时间是real
时间。要真正获得 CPU 时间,您应该总结所有处理时间,即调用 MPI_Reduce
时差和 MPI_SUM
操作。