MPI_Allreduce在不同的求解器位置使用不同的cpu时间

时间:2017-08-21 21:04:42

标签: mpi

在求解器中,我实现了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时间如此不同。该函数之前的代码是否可能对该函数产生影响?

0 个答案:

没有答案