46 if (
config.getUntrackedParameter<
bool>(
"memoryConstruction")) {
49 if (
config.getUntrackedParameter<
bool>(
"memoryBeginStream")) {
52 if (
config.getUntrackedParameter<
bool>(
"memoryPerModule")) {
55 if (
config.getUntrackedParameter<
bool>(
"memoryPerEvent")) {
63 desc.addUntracked<
bool>(
"memoryConstruction",
false)
64 ->setComment(
"Print memory information for each device after the construction of each module");
65 desc.addUntracked<
bool>(
"memoryBeginStream",
true)
66 ->setComment(
"Print memory information for each device after the beginStream() of each module");
67 desc.addUntracked<
bool>(
"memoryPerModule",
true)
68 ->setComment(
"Print memory information for each device after the event of each module");
69 desc.addUntracked<
bool>(
"memoryPerEvent",
true)
70 ->setComment(
"Print memory information for each device after each event");
72 descriptions.
add(
"CUDAMonitoringService",
desc);
74 "The memory information is the global state of the device. This gets confusing if there are multiple processes " 75 "running on the same device. Probably the information retrieval should be re-thought?");
81 void dumpUsedMemory(
T&
log,
int num) {
85 constexpr
auto mbytes = 1 << 20;
86 for (
int i = 0;
i <
num; ++
i) {
87 size_t freeMemory, totalMemory;
89 cudaCheck(cudaMemGetInfo(&freeMemory, &totalMemory));
91 <<
i <<
": " << (totalMemory - freeMemory) / mbytes <<
" MB used / " << totalMemory / mbytes <<
" MB total";
92 auto found = cachingDeviceAllocatorStatus.find(
i);
93 if (
found != cachingDeviceAllocatorStatus.end()) {
94 auto const& cached =
found->second;
95 log <<
"; CachingDeviceAllocator " << cached.live / mbytes <<
" MB live " 96 <<
"(" << cached.liveRequested / mbytes <<
" MB requested) " << cached.free / mbytes <<
" MB free " 97 << (cached.live + cached.free) / mbytes <<
" MB total cached";
106 log <<
"CUDA device memory after construction of " <<
desc.moduleLabel() <<
" (" <<
desc.moduleName() <<
")";
126 log <<
"CUDA device memory after event";
void watchPostModuleConstruction(PostModuleConstruction::slot_type const &iSlot)
CUDAMonitoringService(edm::ParameterSet const &iConfig, edm::ActivityRegistry &iRegistry)
ModuleDescription const * moduleDescription() const
void watchPostEvent(PostEvent::slot_type const &iSlot)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void watchPostModuleEvent(PostModuleEvent::slot_type const &iSlot)
std::string const & moduleName() const
void postEvent(edm::StreamContext const &sc)
allocator::GpuCachedBytes deviceAllocatorStatus()
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Log< level::Warning, true > LogPrint
#define DEFINE_FWK_SERVICE(type)
void setComment(std::string const &value)
void watchPostModuleBeginStream(PostModuleBeginStream::slot_type const &iSlot)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void postModuleConstruction(edm::ModuleDescription const &desc)
void postModuleBeginStream(edm::StreamContext const &, edm::ModuleCallingContext const &mcc)
#define cudaCheck(ARG,...)
~CUDAMonitoringService()=default
std::string const & moduleLabel() const
void postModuleEvent(edm::StreamContext const &sc, edm::ModuleCallingContext const &mcc)