diff --git a/HeterogeneousCore/CUDAServices/interface/CUDAService.h b/HeterogeneousCore/CUDAServices/interface/CUDAService.h index 19cbc6447eb55..e359a5018813a 100644 --- a/HeterogeneousCore/CUDAServices/interface/CUDAService.h +++ b/HeterogeneousCore/CUDAServices/interface/CUDAService.h @@ -1,11 +1,11 @@ #ifndef HeterogeneousCore_CUDAServices_CUDAService_h #define HeterogeneousCore_CUDAServices_CUDAService_h -#include "FWCore/Utilities/interface/StreamID.h" - #include #include +#include "FWCore/Utilities/interface/StreamID.h" + namespace edm { class ParameterSet; class ActivityRegistry; @@ -23,6 +23,7 @@ namespace edm { class CUDAService { public: CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry); + ~CUDAService(); static void fillDescriptions(edm::ConfigurationDescriptions & descriptions); @@ -49,7 +50,7 @@ class CUDAService { private: int numberOfDevices_ = 0; unsigned int numberOfStreamsTotal_ = 0; - std::vector > computeCapabilities_; + std::vector> computeCapabilities_; bool enabled_ = false; }; diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index d520567cc4770..14eeaff109b0c 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -1,16 +1,14 @@ -#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include +#include #include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" -#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" - -#include -#include +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h" -#include - CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry) { bool configEnabled = iConfig.getUntrackedParameter("enabled"); if(!configEnabled) { @@ -64,6 +62,15 @@ CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry enabled_ = true; } +CUDAService::~CUDAService() { + if (enabled_) { + // Explicitly destroys and cleans up all resources associated with the current device in the + // current process. Any subsequent API call to this device will reinitialize the device. + // Useful to check for memory leaks with `cuda-memcheck --tool memcheck --leak-check full`. + cudaCheck(cudaDeviceReset()); + } +} + void CUDAService::fillDescriptions(edm::ConfigurationDescriptions & descriptions) { edm::ParameterSetDescription desc; desc.addUntracked("enabled", true);