88#include < vector>
99#include " utils/command_executor.h"
1010#include " utils/engine_constants.h"
11- # include " utils/logging_utils.h "
11+
1212#ifdef _WIN32
1313#include < windows.h>
1414#endif
@@ -101,44 +101,7 @@ inline bool IsNvidiaSmiAvailable() {
101101#endif
102102}
103103
104- inline std::pair<std::string, std::string> GetDriverAndCudaVersion () {
105- if (!IsNvidiaSmiAvailable ()) {
106- CTL_INF (" nvidia-smi is not available!" );
107- return {};
108- }
109- try {
110- std::string driver_version;
111- std::string cuda_version;
112- CommandExecutor cmd (" nvidia-smi" );
113- auto output = cmd.execute ();
114-
115- const std::regex driver_version_reg (kDriverVersionRegex );
116- std::smatch driver_match;
117-
118- if (std::regex_search (output, driver_match, driver_version_reg)) {
119- LOG_INFO << " Gpu Driver Version: " << driver_match[1 ].str ();
120- driver_version = driver_match[1 ].str ();
121- } else {
122- LOG_ERROR << " Gpu Driver not found!" ;
123- return {};
124- }
125-
126- const std::regex cuda_version_reg (kCudaVersionRegex );
127- std::smatch cuda_match;
128-
129- if (std::regex_search (output, cuda_match, cuda_version_reg)) {
130- LOG_INFO << " CUDA Version: " << cuda_match[1 ].str ();
131- cuda_version = cuda_match[1 ].str ();
132- } else {
133- LOG_ERROR << " CUDA Version not found!" ;
134- return {};
135- }
136- return std::pair (driver_version, cuda_version);
137- } catch (const std::exception& e) {
138- LOG_ERROR << " Error: " << e.what ();
139- return {};
140- }
141- }
104+ std::pair<std::string, std::string> GetDriverAndCudaVersion ();
142105
143106struct GpuInfo {
144107 std::string id;
@@ -153,101 +116,7 @@ struct GpuInfo {
153116 std::string uuid;
154117};
155118
156- inline std::vector<GpuInfo> GetGpuInfoListVulkan () {
157- std::vector<GpuInfo> gpuInfoList;
158-
159- try {
160- // NOTE: current ly we don't have logic to download vulkaninfoSDK
161- #ifdef _WIN32
162- CommandExecutor cmd (" vulkaninfoSDK.exe --summary" );
163- #else
164- CommandExecutor cmd (" vulkaninfoSDK --summary" );
165- #endif
166- auto output = cmd.execute ();
167-
168- // Regular expression patterns to match each field
169- std::regex gpu_block_reg (R"( GPU(\d+):)" );
170- std::regex field_pattern (R"( \s*(\w+)\s*=\s*(.*))" );
171-
172- std::sregex_iterator iter (output.begin (), output.end (), gpu_block_reg);
173- std::sregex_iterator end;
174-
175- while (iter != end) {
176- GpuInfo gpuInfo;
177-
178- // Extract GPU ID from the GPU block pattern (e.g., GPU0 -> id = "0")
179- gpuInfo.id = (*iter)[1 ].str ();
180-
181- auto gpu_start_pos = iter->position (0 ) + iter->length (0 );
182- auto gpu_end_pos = std::next (iter) != end ? std::next (iter)->position (0 )
183- : std::string::npos;
184- std::string gpu_block =
185- output.substr (gpu_start_pos, gpu_end_pos - gpu_start_pos);
119+ std::vector<GpuInfo> GetGpuInfoListVulkan ();
186120
187- std::sregex_iterator field_iter (gpu_block.begin (), gpu_block.end (),
188- field_pattern);
189-
190- while (field_iter != end) {
191- std::string key = (*field_iter)[1 ].str ();
192- std::string value = (*field_iter)[2 ].str ();
193-
194- if (key == " deviceName" )
195- gpuInfo.name = value;
196- else if (key == " apiVersion" )
197- gpuInfo.compute_cap = value;
198-
199- gpuInfo.vram_total = " " ; // not available
200- gpuInfo.arch = GetGpuArch (gpuInfo.name );
201-
202- ++field_iter;
203- }
204-
205- gpuInfoList.push_back (gpuInfo);
206- ++iter;
207- }
208- } catch (const std::exception& e) {
209- LOG_ERROR << " Error: " << e.what ();
210- }
211-
212- return gpuInfoList;
213- }
214-
215- inline std::vector<GpuInfo> GetGpuInfoList () {
216- std::vector<GpuInfo> gpuInfoList;
217- if (!IsNvidiaSmiAvailable ())
218- return gpuInfoList;
219- try {
220- auto [driver_version, cuda_version] = GetDriverAndCudaVersion ();
221- if (driver_version.empty () || cuda_version.empty ())
222- return gpuInfoList;
223-
224- CommandExecutor cmd (kGpuQueryCommand );
225- auto output = cmd.execute ();
226-
227- const std::regex gpu_info_reg (kGpuInfoRegex );
228- std::smatch match;
229- std::string::const_iterator search_start (output.cbegin ());
230-
231- while (
232- std::regex_search (search_start, output.cend (), match, gpu_info_reg)) {
233- GpuInfo gpuInfo = {
234- match[1 ].str (), // id
235- match[2 ].str (), // vram_total
236- match[3 ].str (), // vram_free
237- match[4 ].str (), // name
238- GetGpuArch (match[4 ].str ()), // arch
239- driver_version, // driver_version
240- cuda_version, // cuda_driver_version
241- match[5 ].str (), // compute_cap
242- match[6 ].str () // uuid
243- };
244- gpuInfoList.push_back (gpuInfo);
245- search_start = match.suffix ().first ;
246- }
247- } catch (const std::exception& e) {
248- std::cerr << " Error: " << e.what () << std::endl;
249- }
250-
251- return gpuInfoList;
252- }
121+ std::vector<GpuInfo> GetGpuInfoList ();
253122} // namespace system_info_utils
0 commit comments