mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: add simple profiling of MPI communications
This commit is contained in:
committed by
Andrew Heather
parent
53be19989b
commit
828f8e8504
@ -11,6 +11,7 @@ global/profiling/profiling.C
|
|||||||
global/profiling/profilingInformation.C
|
global/profiling/profilingInformation.C
|
||||||
global/profiling/profilingSysInfo.C
|
global/profiling/profilingSysInfo.C
|
||||||
global/profiling/profilingTrigger.C
|
global/profiling/profilingTrigger.C
|
||||||
|
global/profiling/profilingPstream.C
|
||||||
global/etcFiles/etcFiles.C
|
global/etcFiles/etcFiles.C
|
||||||
global/version/foamVersion.C
|
global/version/foamVersion.C
|
||||||
|
|
||||||
|
|||||||
100
src/OpenFOAM/global/profiling/profilingPstream.C
Normal file
100
src/OpenFOAM/global/profiling/profilingPstream.C
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "profilingPstream.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::autoPtr<Foam::cpuTime> Foam::profilingPstream::timer_(nullptr);
|
||||||
|
|
||||||
|
Foam::autoPtr<Foam::cpuTime> Foam::profilingPstream::suspend_(nullptr);
|
||||||
|
|
||||||
|
Foam::FixedList<Foam::scalar, 5> Foam::profilingPstream::times_(Zero);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::profilingPstream::profilingPstream()
|
||||||
|
{
|
||||||
|
enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::profilingPstream::~profilingPstream()
|
||||||
|
{
|
||||||
|
disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::profilingPstream::enable()
|
||||||
|
{
|
||||||
|
if (timer_.valid())
|
||||||
|
{
|
||||||
|
timer_->resetCpuTime(); // Not really needed ...
|
||||||
|
}
|
||||||
|
else if (suspend_.valid())
|
||||||
|
{
|
||||||
|
suspend_.swap(timer_);
|
||||||
|
timer_->resetCpuTime(); // Not really needed ...
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
timer_.reset(new cpuTime);
|
||||||
|
times_ = Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::profilingPstream::disable()
|
||||||
|
{
|
||||||
|
timer_.clear();
|
||||||
|
suspend_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::profilingPstream::suspend()
|
||||||
|
{
|
||||||
|
suspend_.clear();
|
||||||
|
suspend_.swap(timer_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::profilingPstream::resume()
|
||||||
|
{
|
||||||
|
if (suspend_.valid())
|
||||||
|
{
|
||||||
|
timer_.clear();
|
||||||
|
timer_.swap(suspend_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
179
src/OpenFOAM/global/profiling/profilingPstream.H
Normal file
179
src/OpenFOAM/global/profiling/profilingPstream.H
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::profilingPstream
|
||||||
|
|
||||||
|
Description
|
||||||
|
Timers and values for simple (simplistic) mpi-profiling. The entire
|
||||||
|
class behaves as a singleton.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
profilingPstream.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef profilingPstream_H
|
||||||
|
#define profilingPstream_H
|
||||||
|
|
||||||
|
#include "autoPtr.H"
|
||||||
|
#include "cpuTime.H"
|
||||||
|
#include "scalar.H"
|
||||||
|
#include "FixedList.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class profilingPstream Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class profilingPstream
|
||||||
|
{
|
||||||
|
//- Timer to use
|
||||||
|
static autoPtr<cpuTime> timer_;
|
||||||
|
|
||||||
|
//- Stash for timer during suspend
|
||||||
|
static autoPtr<cpuTime> suspend_;
|
||||||
|
|
||||||
|
//- The timing values
|
||||||
|
static FixedList<scalar, 5> times_;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Enumeration within times array
|
||||||
|
enum timingType
|
||||||
|
{
|
||||||
|
GATHER = 0,
|
||||||
|
SCATTER,
|
||||||
|
REDUCE,
|
||||||
|
WAIT,
|
||||||
|
ALL_TO_ALL
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct and enable global timer
|
||||||
|
profilingPstream();
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor - remove global timer
|
||||||
|
~profilingPstream();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Create timer for measuring communication, or reset existing
|
||||||
|
static void enable();
|
||||||
|
|
||||||
|
//- Remove timer for measuring communication activity
|
||||||
|
static void disable();
|
||||||
|
|
||||||
|
//- Suspend use of timer (if active)
|
||||||
|
static void suspend();
|
||||||
|
|
||||||
|
//- Resume use of timer (if previously active)
|
||||||
|
static void resume();
|
||||||
|
|
||||||
|
//- Timer is active
|
||||||
|
inline static bool active()
|
||||||
|
{
|
||||||
|
return timer_.valid();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Access to the timing information
|
||||||
|
inline static FixedList<scalar, 5>& times()
|
||||||
|
{
|
||||||
|
return times_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Access to the timing information
|
||||||
|
inline static scalar times(const enum timingType idx)
|
||||||
|
{
|
||||||
|
return times_[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Update timer prior to measurement
|
||||||
|
inline static void beginTiming()
|
||||||
|
{
|
||||||
|
if (timer_.valid())
|
||||||
|
{
|
||||||
|
(void) timer_->cpuTimeIncrement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Add time increment
|
||||||
|
inline static void addTime(const enum timingType idx)
|
||||||
|
{
|
||||||
|
if (timer_.valid())
|
||||||
|
{
|
||||||
|
times_[idx] += timer_->cpuTimeIncrement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Add time increment to gatherTime
|
||||||
|
inline static void addGatherTime()
|
||||||
|
{
|
||||||
|
addTime(GATHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Add time increment to scatterTime
|
||||||
|
inline static void addScatterTime()
|
||||||
|
{
|
||||||
|
addTime(SCATTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Add time increment to reduceTime
|
||||||
|
inline static void addReduceTime()
|
||||||
|
{
|
||||||
|
addTime(REDUCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Add time increment to waitTime
|
||||||
|
inline static void addWaitTime()
|
||||||
|
{
|
||||||
|
addTime(WAIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Add time increment to allToAllTime
|
||||||
|
inline static void addAllToAllTime()
|
||||||
|
{
|
||||||
|
addTime(ALL_TO_ALL);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd |
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
@ -30,6 +30,7 @@ Description
|
|||||||
|
|
||||||
#include "UIPstream.H"
|
#include "UIPstream.H"
|
||||||
#include "PstreamGlobals.H"
|
#include "PstreamGlobals.H"
|
||||||
|
#include "profilingPstream.H"
|
||||||
#include "IOstreams.H"
|
#include "IOstreams.H"
|
||||||
|
|
||||||
#include <mpi.h>
|
#include <mpi.h>
|
||||||
@ -85,6 +86,8 @@ Foam::UIPstream::UIPstream
|
|||||||
// and set it
|
// and set it
|
||||||
if (!wantedSize)
|
if (!wantedSize)
|
||||||
{
|
{
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
MPI_Probe
|
MPI_Probe
|
||||||
(
|
(
|
||||||
fromProcNo_,
|
fromProcNo_,
|
||||||
@ -94,6 +97,8 @@ Foam::UIPstream::UIPstream
|
|||||||
);
|
);
|
||||||
MPI_Get_count(&status, MPI_BYTE, &messageSize_);
|
MPI_Get_count(&status, MPI_BYTE, &messageSize_);
|
||||||
|
|
||||||
|
profilingPstream::addWaitTime();
|
||||||
|
|
||||||
externalBuf_.setCapacity(messageSize_);
|
externalBuf_.setCapacity(messageSize_);
|
||||||
wantedSize = messageSize_;
|
wantedSize = messageSize_;
|
||||||
|
|
||||||
@ -186,6 +191,8 @@ Foam::UIPstream::UIPstream(const int fromProcNo, PstreamBuffers& buffers)
|
|||||||
// and set it
|
// and set it
|
||||||
if (!wantedSize)
|
if (!wantedSize)
|
||||||
{
|
{
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
MPI_Probe
|
MPI_Probe
|
||||||
(
|
(
|
||||||
fromProcNo_,
|
fromProcNo_,
|
||||||
@ -195,6 +202,8 @@ Foam::UIPstream::UIPstream(const int fromProcNo, PstreamBuffers& buffers)
|
|||||||
);
|
);
|
||||||
MPI_Get_count(&status, MPI_BYTE, &messageSize_);
|
MPI_Get_count(&status, MPI_BYTE, &messageSize_);
|
||||||
|
|
||||||
|
profilingPstream::addWaitTime();
|
||||||
|
|
||||||
externalBuf_.setCapacity(messageSize_);
|
externalBuf_.setCapacity(messageSize_);
|
||||||
wantedSize = messageSize_;
|
wantedSize = messageSize_;
|
||||||
|
|
||||||
@ -257,6 +266,8 @@ Foam::label Foam::UIPstream::read
|
|||||||
error::printStack(Pout);
|
error::printStack(Pout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if (commsType == commsTypes::blocking || commsType == commsTypes::scheduled)
|
if (commsType == commsTypes::blocking || commsType == commsTypes::scheduled)
|
||||||
{
|
{
|
||||||
MPI_Status status;
|
MPI_Status status;
|
||||||
@ -282,6 +293,7 @@ Foam::label Foam::UIPstream::read
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addScatterTime();
|
||||||
|
|
||||||
// Check size of message read
|
// Check size of message read
|
||||||
|
|
||||||
@ -332,6 +344,8 @@ Foam::label Foam::UIPstream::read
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addScatterTime();
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Pout<< "UIPstream::read : started read from:" << fromProcNo
|
Pout<< "UIPstream::read : started read from:" << fromProcNo
|
||||||
@ -346,15 +360,12 @@ Foam::label Foam::UIPstream::read
|
|||||||
// Assume the message is completely received.
|
// Assume the message is completely received.
|
||||||
return bufSize;
|
return bufSize;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
FatalErrorInFunction
|
FatalErrorInFunction
|
||||||
<< "Unsupported communications type "
|
<< "Unsupported communications type " << int(commsType)
|
||||||
<< int(commsType)
|
|
||||||
<< Foam::abort(FatalError);
|
<< Foam::abort(FatalError);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd |
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
@ -30,6 +30,7 @@ Description
|
|||||||
|
|
||||||
#include "UOPstream.H"
|
#include "UOPstream.H"
|
||||||
#include "PstreamGlobals.H"
|
#include "PstreamGlobals.H"
|
||||||
|
#include "profilingPstream.H"
|
||||||
|
|
||||||
#include <mpi.h>
|
#include <mpi.h>
|
||||||
|
|
||||||
@ -70,6 +71,8 @@ bool Foam::UOPstream::write
|
|||||||
|
|
||||||
bool transferFailed = true;
|
bool transferFailed = true;
|
||||||
|
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if (commsType == commsTypes::blocking)
|
if (commsType == commsTypes::blocking)
|
||||||
{
|
{
|
||||||
transferFailed = MPI_Bsend
|
transferFailed = MPI_Bsend
|
||||||
@ -82,6 +85,8 @@ bool Foam::UOPstream::write
|
|||||||
PstreamGlobals::MPICommunicators_[communicator] //MPI_COMM_WORLD
|
PstreamGlobals::MPICommunicators_[communicator] //MPI_COMM_WORLD
|
||||||
);
|
);
|
||||||
|
|
||||||
|
profilingPstream::addGatherTime();
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Pout<< "UOPstream::write : finished write to:" << toProcNo
|
Pout<< "UOPstream::write : finished write to:" << toProcNo
|
||||||
@ -102,6 +107,8 @@ bool Foam::UOPstream::write
|
|||||||
PstreamGlobals::MPICommunicators_[communicator] //MPI_COMM_WORLD
|
PstreamGlobals::MPICommunicators_[communicator] //MPI_COMM_WORLD
|
||||||
);
|
);
|
||||||
|
|
||||||
|
profilingPstream::addWaitTime();
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Pout<< "UOPstream::write : finished write to:" << toProcNo
|
Pout<< "UOPstream::write : finished write to:" << toProcNo
|
||||||
@ -125,6 +132,8 @@ bool Foam::UOPstream::write
|
|||||||
&request
|
&request
|
||||||
);
|
);
|
||||||
|
|
||||||
|
profilingPstream::addWaitTime();
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Pout<< "UOPstream::write : started write to:" << toProcNo
|
Pout<< "UOPstream::write : started write to:" << toProcNo
|
||||||
|
|||||||
@ -28,6 +28,7 @@ License
|
|||||||
#include "Pstream.H"
|
#include "Pstream.H"
|
||||||
#include "PstreamReduceOps.H"
|
#include "PstreamReduceOps.H"
|
||||||
#include "PstreamGlobals.H"
|
#include "PstreamGlobals.H"
|
||||||
|
#include "profilingPstream.H"
|
||||||
#include "SubList.H"
|
#include "SubList.H"
|
||||||
#include "allReduce.H"
|
#include "allReduce.H"
|
||||||
#include "int.H"
|
#include "int.H"
|
||||||
@ -501,6 +502,8 @@ void Foam::UPstream::allToAll
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
MPI_Alltoall
|
MPI_Alltoall
|
||||||
@ -522,6 +525,8 @@ void Foam::UPstream::allToAll
|
|||||||
<< " on communicator " << communicator
|
<< " on communicator " << communicator
|
||||||
<< Foam::abort(FatalError);
|
<< Foam::abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addAllToAllTime();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,6 +577,8 @@ void Foam::UPstream::allToAll
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
MPI_Alltoallv
|
MPI_Alltoallv
|
||||||
@ -594,6 +601,8 @@ void Foam::UPstream::allToAll
|
|||||||
<< " communicator " << communicator
|
<< " communicator " << communicator
|
||||||
<< Foam::abort(FatalError);
|
<< Foam::abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addAllToAllTime();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -634,6 +643,8 @@ void Foam::UPstream::gather
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
MPI_Gatherv
|
MPI_Gatherv
|
||||||
@ -656,6 +667,8 @@ void Foam::UPstream::gather
|
|||||||
<< " communicator " << communicator
|
<< " communicator " << communicator
|
||||||
<< Foam::abort(FatalError);
|
<< Foam::abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addGatherTime();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -693,6 +706,8 @@ void Foam::UPstream::scatter
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
MPI_Scatterv
|
MPI_Scatterv
|
||||||
@ -715,6 +730,8 @@ void Foam::UPstream::scatter
|
|||||||
<< " communicator " << communicator
|
<< " communicator " << communicator
|
||||||
<< Foam::abort(FatalError);
|
<< Foam::abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addScatterTime();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -869,6 +886,8 @@ void Foam::UPstream::waitRequests(const label start)
|
|||||||
start
|
start
|
||||||
);
|
);
|
||||||
|
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
MPI_Waitall
|
MPI_Waitall
|
||||||
@ -883,6 +902,8 @@ void Foam::UPstream::waitRequests(const label start)
|
|||||||
<< "MPI_Waitall returned with error" << Foam::endl;
|
<< "MPI_Waitall returned with error" << Foam::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addWaitTime();
|
||||||
|
|
||||||
resetRequests(start);
|
resetRequests(start);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -911,6 +932,8 @@ void Foam::UPstream::waitRequest(const label i)
|
|||||||
<< Foam::abort(FatalError);
|
<< Foam::abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
MPI_Wait
|
MPI_Wait
|
||||||
@ -924,6 +947,8 @@ void Foam::UPstream::waitRequest(const label i)
|
|||||||
<< "MPI_Wait returned with error" << Foam::endl;
|
<< "MPI_Wait returned with error" << Foam::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addWaitTime();
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Pout<< "UPstream::waitRequest : finished wait for request:" << i
|
Pout<< "UPstream::waitRequest : finished wait for request:" << i
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd |
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2012-2015 OpenFOAM Foundation
|
| Copyright (C) 2012-2015 OpenFOAM Foundation
|
||||||
@ -26,6 +26,7 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "allReduce.H"
|
#include "allReduce.H"
|
||||||
|
#include "profilingPstream.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -46,6 +47,8 @@ void Foam::allReduce
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::beginTiming();
|
||||||
|
|
||||||
if (UPstream::nProcs(communicator) <= UPstream::nProcsSimpleSum)
|
if (UPstream::nProcs(communicator) <= UPstream::nProcsSimpleSum)
|
||||||
{
|
{
|
||||||
if (UPstream::master(communicator))
|
if (UPstream::master(communicator))
|
||||||
@ -167,6 +170,8 @@ void Foam::allReduce
|
|||||||
);
|
);
|
||||||
Value = sum;
|
Value = sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profilingPstream::addReduceTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,8 @@ vtkWrite/vtkWriteUpdate.C
|
|||||||
|
|
||||||
removeRegisteredObject/removeRegisteredObject.C
|
removeRegisteredObject/removeRegisteredObject.C
|
||||||
|
|
||||||
|
parProfiling/parProfiling.C
|
||||||
|
|
||||||
solverInfo/solverInfo.C
|
solverInfo/solverInfo.C
|
||||||
|
|
||||||
runTimeControl/runTimeControl.C
|
runTimeControl/runTimeControl.C
|
||||||
|
|||||||
233
src/functionObjects/utilities/parProfiling/parProfiling.C
Normal file
233
src/functionObjects/utilities/parProfiling/parProfiling.C
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "parProfiling.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "UPstream.H"
|
||||||
|
#include "Pstream.H"
|
||||||
|
#include "PstreamReduceOps.H"
|
||||||
|
#include "profilingPstream.H"
|
||||||
|
#include "Tuple2.H"
|
||||||
|
#include "FixedList.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace functionObjects
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(parProfiling, 0);
|
||||||
|
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
functionObject,
|
||||||
|
parProfiling,
|
||||||
|
dictionary
|
||||||
|
);
|
||||||
|
|
||||||
|
} // End namespace functionObject
|
||||||
|
|
||||||
|
|
||||||
|
// Processor and time for each of: -min -max -sum
|
||||||
|
typedef FixedList<Tuple2<label, scalar>, 3> statData;
|
||||||
|
|
||||||
|
|
||||||
|
//- Reduction class. If x and y are not equal assign value.
|
||||||
|
struct statsEqOp
|
||||||
|
{
|
||||||
|
void operator()
|
||||||
|
(
|
||||||
|
FixedList<statData, 2>& xStats,
|
||||||
|
const FixedList<statData, 2>& yStats
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
forAll(xStats, i)
|
||||||
|
{
|
||||||
|
statData& x = xStats[i];
|
||||||
|
const statData& y = yStats[i];
|
||||||
|
|
||||||
|
// 0 : min
|
||||||
|
// 1 : max
|
||||||
|
// 2 : sum
|
||||||
|
if (x[0].second() > y[0].second())
|
||||||
|
{
|
||||||
|
x[0].second() = y[0].second();
|
||||||
|
x[0].first() = y[0].first();
|
||||||
|
}
|
||||||
|
if (x[1].second() < y[1].second())
|
||||||
|
{
|
||||||
|
x[1].second() = y[1].second();
|
||||||
|
x[1].first() = y[1].first();
|
||||||
|
}
|
||||||
|
x[2].second() += y[2].second();
|
||||||
|
x[2].first()++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::functionObjects::parProfiling::parProfiling
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const Time& runTime,
|
||||||
|
const dictionary& dict
|
||||||
|
)
|
||||||
|
:
|
||||||
|
functionObject(name)
|
||||||
|
{
|
||||||
|
profilingPstream::enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::functionObjects::parProfiling::~parProfiling()
|
||||||
|
{
|
||||||
|
profilingPstream::disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::functionObjects::parProfiling::report()
|
||||||
|
{
|
||||||
|
if (!profilingPstream::active())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef FixedList<Tuple2<label, scalar>, 3> statData;
|
||||||
|
FixedList<statData, 2> times;
|
||||||
|
|
||||||
|
{
|
||||||
|
const scalar masterTime =
|
||||||
|
(
|
||||||
|
profilingPstream::times(profilingPstream::REDUCE)
|
||||||
|
+ profilingPstream::times(profilingPstream::GATHER)
|
||||||
|
+ profilingPstream::times(profilingPstream::SCATTER)
|
||||||
|
);
|
||||||
|
|
||||||
|
statData& reduceStats = times[0];
|
||||||
|
|
||||||
|
Tuple2<label, scalar>& minTime = reduceStats[0];
|
||||||
|
minTime.first() = Pstream::myProcNo();
|
||||||
|
minTime.second() = masterTime;
|
||||||
|
|
||||||
|
Tuple2<label, scalar>& maxTime = reduceStats[1];
|
||||||
|
maxTime.first() = Pstream::myProcNo();
|
||||||
|
maxTime.second() = masterTime;
|
||||||
|
|
||||||
|
Tuple2<label, scalar>& sumTime = reduceStats[2];
|
||||||
|
sumTime.first() = 1;
|
||||||
|
sumTime.second() = masterTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const scalar allTime =
|
||||||
|
(
|
||||||
|
profilingPstream::times(profilingPstream::WAIT)
|
||||||
|
+ profilingPstream::times(profilingPstream::ALL_TO_ALL)
|
||||||
|
);
|
||||||
|
|
||||||
|
statData& allToAllStats = times[1];
|
||||||
|
|
||||||
|
Tuple2<label, scalar>& minTime = allToAllStats[0];
|
||||||
|
minTime.first() = Pstream::myProcNo();
|
||||||
|
minTime.second() = allTime;
|
||||||
|
|
||||||
|
Tuple2<label, scalar>& maxTime = allToAllStats[1];
|
||||||
|
maxTime.first() = Pstream::myProcNo();
|
||||||
|
maxTime.second() = allTime;
|
||||||
|
|
||||||
|
Tuple2<label, scalar>& sumTime = allToAllStats[2];
|
||||||
|
sumTime.first() = 1;
|
||||||
|
sumTime.second() = allTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
profilingPstream::suspend();
|
||||||
|
|
||||||
|
Pstream::combineGather(times, statsEqOp());
|
||||||
|
|
||||||
|
profilingPstream::resume();
|
||||||
|
|
||||||
|
|
||||||
|
if (Pstream::master())
|
||||||
|
{
|
||||||
|
const statData& reduceStats = times[0];
|
||||||
|
const statData& allToAllStats = times[1];
|
||||||
|
|
||||||
|
scalar reduceAvg = reduceStats[2].second()/Pstream::nProcs();
|
||||||
|
scalar reduceRelMin =
|
||||||
|
(reduceStats[0].second()-reduceAvg)/(reduceAvg + VSMALL);
|
||||||
|
scalar reduceRelMax =
|
||||||
|
(reduceStats[1].second()-reduceAvg)/(reduceAvg + VSMALL);
|
||||||
|
|
||||||
|
scalar allToAllAvg = allToAllStats[2].second()/Pstream::nProcs();
|
||||||
|
scalar allToAllRelMin =
|
||||||
|
(allToAllStats[0].second()-allToAllAvg)/(allToAllAvg + VSMALL);
|
||||||
|
scalar allToAllRelMax =
|
||||||
|
(allToAllStats[1].second()-allToAllAvg)/(allToAllAvg + VSMALL);
|
||||||
|
|
||||||
|
Info<< type() << ':' << nl
|
||||||
|
<< "\treduce : avg = " << reduceAvg << 's' << nl
|
||||||
|
<< "\t min = " << reduceRelMin*100
|
||||||
|
<< "% (processor " << reduceStats[0].first() << ')' << nl
|
||||||
|
<< "\t max = +" << reduceRelMax*100
|
||||||
|
<< "% (processor " << reduceStats[1].first() << ')' << nl
|
||||||
|
<< "\tall-all : avg = " << allToAllAvg << 's' << nl
|
||||||
|
<< "\t min = " << allToAllRelMin*100
|
||||||
|
<< "% (processor " << allToAllStats[0].first() << ')' << nl
|
||||||
|
<< "\t max = +" << allToAllRelMax*100
|
||||||
|
<< "% (processor " << allToAllStats[1].first() << ')' << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::functionObjects::parProfiling::execute()
|
||||||
|
{
|
||||||
|
report();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::functionObjects::parProfiling::write()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::functionObjects::parProfiling::end()
|
||||||
|
{
|
||||||
|
report();
|
||||||
|
profilingPstream::disable();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
117
src/functionObjects/utilities/parProfiling/parProfiling.H
Normal file
117
src/functionObjects/utilities/parProfiling/parProfiling.H
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::functionObjects::parProfiling
|
||||||
|
|
||||||
|
Group
|
||||||
|
grpUtilitiesFunctionObjects
|
||||||
|
|
||||||
|
Description
|
||||||
|
Simple (simplistic) mpi-profiling.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
parProfiling.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef functionObjects_parProfiling_H
|
||||||
|
#define functionObjects_parProfiling_H
|
||||||
|
|
||||||
|
#include "functionObject.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// Forward declaration of classes
|
||||||
|
class Time;
|
||||||
|
|
||||||
|
namespace functionObjects
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class parProfiling Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class parProfiling
|
||||||
|
:
|
||||||
|
public functionObject
|
||||||
|
{
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
|
parProfiling(const parProfiling&) = delete;
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
|
void operator=(const parProfiling&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("parProfiling");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from Time and dictionary
|
||||||
|
parProfiling
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const Time& runTime,
|
||||||
|
const dictionary& dict
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~parProfiling();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Report the current profiling information
|
||||||
|
void report();
|
||||||
|
|
||||||
|
//- Report
|
||||||
|
virtual bool execute();
|
||||||
|
|
||||||
|
//- Do nothing
|
||||||
|
virtual bool write();
|
||||||
|
|
||||||
|
//- Report
|
||||||
|
virtual bool end();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace functionObjects
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -55,6 +55,8 @@ functions
|
|||||||
|
|
||||||
// Demonstrate runTimePostProcessing
|
// Demonstrate runTimePostProcessing
|
||||||
#include "visualization"
|
#include "visualization"
|
||||||
|
|
||||||
|
#include "profiling"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,20 @@
|
|||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||||
|
| \\ / O peration | Version: v1812 |
|
||||||
|
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
profiling
|
||||||
|
{
|
||||||
|
type parProfiling;
|
||||||
|
|
||||||
|
libs ("libutilityFunctionObjects.so");
|
||||||
|
|
||||||
|
executeControl none;
|
||||||
|
writeControl writeTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
Reference in New Issue
Block a user