在求解器中,我实现了MPI来进行模拟。我使用clock()来检查求解器各部分的CPU时间。以下代码用于检查CPU时间:
MPI_Barrier(SlaveComm);
clock_t pre_dot1 = clock();
newrho = symmat->Lddot_MPI(n,r,z,false);
clock_t after_dot1 = clock();
time_dot3 += (after_dot1 - pre_dot1)/(double) CLOCKS_PER_SEC;
Lddot_MPI是一个非常简单的函数,它计算点,如下面的代码所示:
double BaseMatrix::Lddot_MPI(int n,double x[], double y[], bool forall){
// the dot product of two vectors.
double dsum(0.0);
for (int ii=0; ii<n; ii++)
{
dsum = dsum + x[ii]*y[ii];
}
double dsum_total(0.0);
if (forall)
MPI_Allreduce(&dsum, &dsum_total, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
else
MPI_Allreduce(&dsum, &dsum_total, 1, MPI_DOUBLE, MPI_SUM, SlaveComm);
return dsum_total;
}
我在同一个forloop中的三个不同位置调用此函数,这意味着
for (int i=0; i<10000; i++)
{
newrho = symmat->Lddot_MPI(n,r,z,false);
.
.
.
newrho1 = symmat->Lddot_MPI(n,r,z,false);
.
.
.
newrho2 = symmat->Lddot_MPI(n,r,z,false);
.
.
.
}
因为在每次调用此函数之前,MPI_Barrier用于同步所有任务。 (这仅用于测试目的)。所以计算的cpu时间只是这个函数的cpu时间。由于在forloop重复中调用该函数,因此cpu时间是所有重复调用的累计cpu时间。我发现这三个函数的cpu时间(或三个位置的相同函数)实质上是不同的。一个可以比另一个长20倍。我还写出了每个调用的cpu时间。一个功能也比另一个功能更长。
我认为这个功能在三个位置的计算和通信是相同的。我想知道为什么cpu时间如此不同。该函数之前的代码是否可能对该函数产生影响?