4545namespace cubool {
4646
4747 std::unordered_set<class MatrixBase *> Library::mAllocated ;
48- BackendBase* Library::mBackend = nullptr ;
48+ std::shared_ptr< class BackendBase > Library::mBackend = nullptr ;
4949 std::shared_ptr<class Logger > Library::mLogger = std::make_shared<DummyLogger>();
5050 bool Library::mRelaxedRelease = false ;
5151
@@ -57,75 +57,61 @@ namespace cubool {
5757 // If user do not force the cpu backend usage
5858 if (!preferCpu) {
5959#ifdef CUBOOL_WITH_CUDA
60- mBackend = new CudaBackend ();
60+ mBackend = std::make_shared< CudaBackend> ();
6161 mBackend ->initialize (initHints);
6262
6363 // Failed to setup cuda, release backend and go to try cpu
6464 if (!mBackend ->isInitialized ()) {
65- delete mBackend ;
6665 mBackend = nullptr ;
67-
6866 mLogger ->logWarning (" Failed to initialize Cuda backend" );
6967 }
7068#endif
7169 }
7270
7371#ifdef CUBOOL_WITH_SEQUENTIAL
7472 if (mBackend == nullptr ) {
75- mBackend = new SqBackend ();
73+ mBackend = std::make_shared< SqBackend> ();
7674 mBackend ->initialize (initHints);
7775
7876 // Failed somehow setup
7977 if (!mBackend ->isInitialized ()) {
80- delete mBackend ;
8178 mBackend = nullptr ;
82-
8379 mLogger ->logWarning (" Failed to initialize Cpu fallback backend" );
8480 }
8581 }
8682#endif
8783
8884 CHECK_RAISE_ERROR (mBackend != nullptr , BackendError, " Failed to select backend" );
89- mRelaxedRelease = initHints & CUBOOL_HINT_RELAXED_FINALIZE;
90-
91- // Log device caps
92- cuBool_DeviceCaps caps;
93- queryCapabilities (caps);
9485
95- std::stringstream ss;
96-
97- if (caps.cudaSupported ) {
98- ss << " Cuda device capabilities" << std::endl
99- << " name: " << caps.name << std::endl
100- << " major: " << caps.major << std::endl
101- << " minor: " << caps.minor << std::endl
102- << " warp size: " << caps.warp << std::endl
103- << " globalMemoryKiBs: " << caps.globalMemoryKiBs << std::endl
104- << " sharedMemoryPerMultiProcKiBs: " << caps.sharedMemoryPerMultiProcKiBs << std::endl
105- << " sharedMemoryPerBlockKiBs: " << caps.sharedMemoryPerBlockKiBs << std::endl;
106- }
107- else {
108- ss << " Cuda device is not presented" ;
109- }
110-
111- mLogger ->logInfo (ss.str ());
86+ // If initialized, post-init actions
87+ mRelaxedRelease = initHints & CUBOOL_HINT_RELAXED_FINALIZE;
88+ logDeviceInfo ();
11289 }
11390
11491 void Library::finalize () {
11592 if (mBackend ) {
11693 // Release all allocated resources implicitly
11794 if (mRelaxedRelease ) {
11895 for (auto m: mAllocated ) {
96+ std::stringstream s;
97+ s << " Implicitly release matrix instance " << m;
98+
99+ mLogger ->logWarning (s.str ());
119100 delete m;
120101 }
121102
122103 mAllocated .clear ();
123104 }
124105
106+ // Some final message
107+ mLogger ->logInfo (" ** cuBool:Finalize backend **" );
108+
125109 // Remember to finalize backend
126110 mBackend ->finalize ();
127- delete mBackend ;
128111 mBackend = nullptr ;
112+
113+ // Release (possibly setup text logger) logger, reassign dummy
114+ mLogger = std::make_shared<DummyLogger>();
129115 }
130116 }
131117
@@ -179,14 +165,18 @@ namespace cubool {
179165 file << " Level::Always" ;
180166 }
181167 file << std::setw (-1 ) << " ] " ;
182- file << message << std::endl << std::endl ;
168+ file << message << std::endl;
183169 });
184170
185171 // Assign new text logger
186172 mLogger = textLogger;
187173
188174 // Initial message
189175 mLogger ->logInfo (" *** cuBool::Logger file ***" );
176+
177+ // Also log device capabilities
178+ if (isBackedInitialized ())
179+ logDeviceInfo ();
190180 }
191181
192182 MatrixBase *Library::createMatrix (size_t nrows, size_t ncols) {
@@ -222,6 +212,34 @@ namespace cubool {
222212 mBackend ->queryCapabilities (caps);
223213 }
224214
215+ void Library::logDeviceInfo () {
216+ // Log device caps
217+ cuBool_DeviceCaps caps;
218+ queryCapabilities (caps);
219+
220+ std::stringstream ss;
221+
222+ if (caps.cudaSupported ) {
223+ ss << " Cuda device capabilities" << std::endl
224+ << " name: " << caps.name << std::endl
225+ << " major: " << caps.major << std::endl
226+ << " minor: " << caps.minor << std::endl
227+ << " warp size: " << caps.warp << std::endl
228+ << " globalMemoryKiBs: " << caps.globalMemoryKiBs << std::endl
229+ << " sharedMemoryPerMultiProcKiBs: " << caps.sharedMemoryPerMultiProcKiBs << std::endl
230+ << " sharedMemoryPerBlockKiBs: " << caps.sharedMemoryPerBlockKiBs << std::endl;
231+ }
232+ else {
233+ ss << " Cuda device is not presented" ;
234+ }
235+
236+ mLogger ->logInfo (ss.str ());
237+ }
238+
239+ bool Library::isBackedInitialized () {
240+ return mBackend != nullptr ;
241+ }
242+
225243 class Logger * Library::getLogger () {
226244 return mLogger .get ();
227245 }
0 commit comments