IgANet
IGAnets - Isogeometric Analysis Networks
Loading...
Searching...
No Matches
sysinfo.hpp
Go to the documentation of this file.
1
15#pragma once
16
17#include <string>
18#include <string_view>
19#include <filesystem>
20
21#if defined(_WIN32) || defined(_WIN64)
22#include <windows.h>
23#elif __APPLE__
24#include <mach-o/dyld.h>
25#include <sys/sysctl.h>
26#include <sys/utsname.h>
27#elif __linux__ || __unix__
28#include <unistd.h>
29#if defined(__x86_64__) && (defined(__GNUC__) || defined(__clang__) || \
30 defined(__INTEL_COMPILER) || defined(__SUNCC_PRO))
31#include <cpuid.h>
32#else
33#include <limits.h>
34#endif
35#endif
36
37#include <iganet/core/config.hpp>
38
39namespace iganet {
40
43inline constexpr std::string_view getIgANetVersion() noexcept {
44 return IGANET_VERSION;
45}
46
50inline std::string getCompilerVersion() {
51 // This code is copied from the CMakeCXXCompilerId.cpp file that was
52 // automatically generated with CMake 3.21.4
53
54 // The following two macros have been modified as we do not want to
55 // return the compiler version in the specific CMake format
57#define DEC(n) n
58#define HEX(n) n
59
60 /* Version number components: V=Version, R=Revision, P=Patch
61 Version date components: YYYY=Year, MM=Month, DD=Day */
62
63#if defined(__COMO__)
64#define COMPILER_ID "Comeau"
65 /* __COMO_VERSION__ = VRR */
66#define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
67#define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
68
69#elif defined(__INTEL_COMPILER) || defined(__ICC)
70#define COMPILER_ID "Intel"
71#if defined(_MSC_VER)
72#define SIMULATE_ID "MSVC"
73#endif
74#if defined(__GNUC__)
75#define SIMULATE_ID "GNU"
76#endif
77 /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later,
78 except that a few beta releases use the old format with V=2021. */
79#if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || \
80 __INTEL_COMPILER == 202111
81#define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER / 100)
82#define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER / 10 % 10)
83#if defined(__INTEL_COMPILER_UPDATE)
84#define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
85#else
86#define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
87#endif
88#else
89#define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER)
90#define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE)
91 /* The third version component from --version is an update index,
92 but no macro is provided for it. */
93#define COMPILER_VERSION_PATCH DEC(0)
94#endif
95#if defined(__INTEL_COMPILER_BUILD_DATE)
96 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
97#define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
98#endif
99#if defined(_MSC_VER)
100 /* _MSC_VER = VVRR */
101#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
102#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
103#endif
104#if defined(__GNUC__)
105#define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
106#elif defined(__GNUG__)
107#define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
108#endif
109#if defined(__GNUC_MINOR__)
110#define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
111#endif
112#if defined(__GNUC_PATCHLEVEL__)
113#define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
114#endif
115
116#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || \
117 defined(__INTEL_LLVM_COMPILER)
118#define COMPILER_ID "IntelLLVM"
119#if defined(_MSC_VER)
120#define SIMULATE_ID "MSVC"
121#endif
122#if defined(__GNUC__)
123#define SIMULATE_ID "GNU"
124#endif
125 /* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and
126 * later. Look for 6 digit vs. 8 digit version number to decide encoding.
127 * VVVV is no smaller than the current year when a version is released.
128 */
129#if __INTEL_LLVM_COMPILER < 1000000L
130#define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER / 100)
131#define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER / 10 % 10)
132#define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10)
133#else
134#define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER / 10000)
135#define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER / 100 % 100)
136#define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100)
137#endif
138#if defined(_MSC_VER)
139 /* _MSC_VER = VVRR */
140#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
141#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
142#endif
143#if defined(__GNUC__)
144#define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
145#elif defined(__GNUG__)
146#define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
147#endif
148#if defined(__GNUC_MINOR__)
149#define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
150#endif
151#if defined(__GNUC_PATCHLEVEL__)
152#define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
153#endif
154
155#elif defined(__PATHCC__)
156#define COMPILER_ID "PathScale"
157#define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
158#define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
159#if defined(__PATHCC_PATCHLEVEL__)
160#define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
161#endif
162
163#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
164#define COMPILER_ID "Embarcadero"
165#define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__ >> 24 & 0x00FF)
166#define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__ >> 16 & 0x00FF)
167#define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
168
169#elif defined(__BORLANDC__)
170#define COMPILER_ID "Borland"
171 /* __BORLANDC__ = 0xVRR */
172#define COMPILER_VERSION_MAJOR HEX(__BORLANDC__ >> 8)
173#define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
174
175#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
176#define COMPILER_ID "Watcom"
177 /* __WATCOMC__ = VVRR */
178#define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
179#define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
180#if (__WATCOMC__ % 10) > 0
181#define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
182#endif
183
184#elif defined(__WATCOMC__)
185#define COMPILER_ID "OpenWatcom"
186 /* __WATCOMC__ = VVRP + 1100 */
187#define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
188#define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
189#if (__WATCOMC__ % 10) > 0
190#define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
191#endif
192
193#elif defined(__SUNPRO_CC)
194#define COMPILER_ID "SunPro"
195#if __SUNPRO_CC >= 0x5100
196 /* __SUNPRO_CC = 0xVRRP */
197#define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC >> 12)
198#define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC >> 4 & 0xFF)
199#define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
200#else
201 /* __SUNPRO_CC = 0xVRP */
202#define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC >> 8)
203#define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC >> 4 & 0xF)
204#define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
205#endif
206
207#elif defined(__HP_aCC)
208#define COMPILER_ID "HP"
209 /* __HP_aCC = VVRRPP */
210#define COMPILER_VERSION_MAJOR DEC(__HP_aCC / 10000)
211#define COMPILER_VERSION_MINOR DEC(__HP_aCC / 100 % 100)
212#define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
213
214#elif defined(__DECCXX)
215#define COMPILER_ID "Compaq"
216 /* __DECCXX_VER = VVRRTPPPP */
217#define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER / 10000000)
218#define COMPILER_VERSION_MINOR DEC(__DECCXX_VER / 100000 % 100)
219#define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
220
221#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
222#define COMPILER_ID "zOS"
223 /* __IBMCPP__ = VRP */
224#define COMPILER_VERSION_MAJOR DEC(__IBMCPP__ / 100)
225#define COMPILER_VERSION_MINOR DEC(__IBMCPP__ / 10 % 10)
226#define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
227
228#elif defined(__ibmxl__) && defined(__clang__)
229#define COMPILER_ID "XLClang"
230#define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
231#define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
232#define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
233#define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
234
235#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
236#define COMPILER_ID "XL"
237 /* __IBMCPP__ = VRP */
238#define COMPILER_VERSION_MAJOR DEC(__IBMCPP__ / 100)
239#define COMPILER_VERSION_MINOR DEC(__IBMCPP__ / 10 % 10)
240#define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
241
242#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
243#define COMPILER_ID "VisualAge"
244 /* __IBMCPP__ = VRP */
245#define COMPILER_VERSION_MAJOR DEC(__IBMCPP__ / 100)
246#define COMPILER_VERSION_MINOR DEC(__IBMCPP__ / 10 % 10)
247#define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
248
249#elif defined(__NVCOMPILER)
250#define COMPILER_ID "NVHPC"
251#define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__)
252#define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__)
253#if defined(__NVCOMPILER_PATCHLEVEL__)
254#define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__)
255#endif
256
257#elif defined(__PGI)
258#define COMPILER_ID "PGI"
259#define COMPILER_VERSION_MAJOR DEC(__PGIC__)
260#define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
261#if defined(__PGIC_PATCHLEVEL__)
262#define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
263#endif
264
265#elif defined(_CRAYC)
266#define COMPILER_ID "Cray"
267#define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
268#define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
269
270#elif defined(__TI_COMPILER_VERSION__)
271#define COMPILER_ID "TI"
272 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
273#define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__ / 1000000)
274#define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__ / 1000 % 1000)
275#define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
276
277#elif defined(__CLANG_FUJITSU)
278#define COMPILER_ID "FujitsuClang"
279#define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
280#define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
281#define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
282#define COMPILER_VERSION_INTERNAL_STR __clang_version__
283
284#elif defined(__FUJITSU)
285#define COMPILER_ID "Fujitsu"
286#if defined(__FCC_version__)
287#define COMPILER_VERSION __FCC_version__
288#elif defined(__FCC_major__)
289#define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
290#define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
291#define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
292#endif
293#if defined(__fcc_version)
294#define COMPILER_VERSION_INTERNAL DEC(__fcc_version)
295#elif defined(__FCC_VERSION)
296#define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION)
297#endif
298
299#elif defined(__ghs__)
300#define COMPILER_ID "GHS"
301 /* __GHS_VERSION_NUMBER = VVVVRP */
302#ifdef __GHS_VERSION_NUMBER
303#define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
304#define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
305#define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
306#endif
307
308#elif defined(__SCO_VERSION__)
309#define COMPILER_ID "SCO"
310
311#elif defined(__ARMCC_VERSION) && !defined(__clang__)
312#define COMPILER_ID "ARMCC"
313#if __ARMCC_VERSION >= 1000000
314 /* __ARMCC_VERSION = VRRPPPP */
315#define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION / 1000000)
316#define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION / 10000 % 100)
317#define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
318#else
319 /* __ARMCC_VERSION = VRPPPP */
320#define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION / 100000)
321#define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION / 10000 % 10)
322#define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
323#endif
324
325#elif defined(__clang__) && defined(__apple_build_version__)
326#define COMPILER_ID "AppleClang"
327#if defined(_MSC_VER)
328#define SIMULATE_ID "MSVC"
329#endif
330#define COMPILER_VERSION_MAJOR DEC(__clang_major__)
331#define COMPILER_VERSION_MINOR DEC(__clang_minor__)
332#define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
333#if defined(_MSC_VER)
334 /* _MSC_VER = VVRR */
335#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
336#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
337#endif
338#define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
339
340#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION)
341#define COMPILER_ID "ARMClang"
342#define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION / 1000000)
343#define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION / 10000 % 100)
344#define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000)
345#define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION)
346
347#elif defined(__clang__)
348#define COMPILER_ID "Clang"
349#if defined(_MSC_VER)
350#define SIMULATE_ID "MSVC"
351#endif
352#define COMPILER_VERSION_MAJOR DEC(__clang_major__)
353#define COMPILER_VERSION_MINOR DEC(__clang_minor__)
354#define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
355#if defined(_MSC_VER)
356 /* _MSC_VER = VVRR */
357#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
358#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
359#endif
360
361#elif defined(__GNUC__) || defined(__GNUG__)
362#define COMPILER_ID "GNU"
363#if defined(__GNUC__)
364#define COMPILER_VERSION_MAJOR DEC(__GNUC__)
365#else
366#define COMPILER_VERSION_MAJOR DEC(__GNUG__)
367#endif
368#if defined(__GNUC_MINOR__)
369#define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
370#endif
371#if defined(__GNUC_PATCHLEVEL__)
372#define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
373#endif
374
375#elif defined(_MSC_VER)
376#define COMPILER_ID "MSVC"
377 /* _MSC_VER = VVRR */
378#define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
379#define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
380#if defined(_MSC_FULL_VER)
381#if _MSC_VER >= 1400
382 /* _MSC_FULL_VER = VVRRPPPPP */
383#define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
384#else
385 /* _MSC_FULL_VER = VVRRPPPP */
386#define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
387#endif
388#endif
389#if defined(_MSC_BUILD)
390#define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
391#endif
392
393#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || \
394 defined(__ADSPTS__) || defined(__ADSP21000__)
395#define COMPILER_ID "ADSP"
396#if defined(__VISUALDSPVERSION__)
397 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
398#define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__ >> 24)
399#define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__ >> 16 & 0xFF)
400#define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__ >> 8 & 0xFF)
401#endif
402
403#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
404#define COMPILER_ID "IAR"
405#if defined(__VER__) && defined(__ICCARM__)
406#define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
407#define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
408#define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
409#define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
410#elif defined(__VER__) && \
411 (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || \
412 defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || \
413 defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__))
414#define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
415#define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100) * 100))
416#define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
417#define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
418#endif
419
420 /* These compilers are either not known or too old to define an
421 identification macro. Try to identify the platform and guess that
422 it is the native compiler. */
423#elif defined(__hpux) || defined(__hpua)
424#define COMPILER_ID "HP"
425
426#else /* unknown compiler */
427#define COMPILER_ID "Unknown-Compiler"
428#endif
429
431 return std::string(COMPILER_ID)
432#ifdef COMPILER_VERSION
433 + " " + std::to_string(COMPILER_VERSION);
434#elif defined(COMPILER_VERSION_MAJOR)
435 + " " + std::to_string(COMPILER_VERSION_MAJOR)
436#ifdef COMPILER_VERSION_MINOR
437 + "." + std::to_string(COMPILER_VERSION_MINOR)
438#ifdef COMPILER_VERSION_PATCH
439 + "." + std::to_string(COMPILER_VERSION_PATCH)
440#ifdef COMPILER_VERSION_TWEAK
441 + "." + std::to_string(COMPILER_VERSION_TWEAK)
442#endif
443#endif
444#endif
445 ;
446#endif
447
448#undef DEC
449#undef HEX
450#undef COMPILER_ID
451#undef COMPILER_VERSION
452#undef COMPILER_VERSION_MAJOR
453#undef COMPILER_VERSION_MINOR
454#undef COMPILER_VERSION_PATCH
455#undef COMPILER_VERSION_TWEAK
456#undef SIMULATE_VERSION_MAJOR
457#undef SIMULATE_VERSION_MINOR
458#undef SIMULATE_VERSION_PATCH
459#undef SIMULATE_VERSION_TWEAK
460}
461
464inline std::string getCppVersion() {
465#if defined(_MSC_VER) && _MSC_VER < 1600
466 return "C++ 199711L";
467#elif _MSC_VER >= 1900
468 return "C++ " + std::to_string(_MSVC_LANG);
469#elif _MSC_VER >= 1600
470 return "C++ 201103L";
471#else
472 return "C++ " + std::to_string(__cplusplus);
473#endif
474}
475
479inline std::string getStdLibVersion() {
480#ifdef _LIBCPP_VERSION
481 return "libc++ " + std::to_string(_LIBCPP_VERSION);
482#elif defined(__GLIBCXX__)
483 return "glibc++ " + std::to_string(__GLIBCXX__);
484#elif defined(__GLIBCPP__)
485 return "glibc++ " + std::to_string(__GLIBCPP__);
486#elif defined(__LIBCOMO__)
487 return "Comeau STL " + std::to_string(__LIBCOMO__);
488#elif defined(__STL_CONFIG_H)
489 return "SGI STL";
490#elif defined(__MSL_CPP__)
491 return "MSL standard lib";
492#elif defined(__IBMCPP__)
493 return "VACPP STL";
494#elif defined(MSIPL_COMPILE_H)
495 return "Modena C++ STL";
496#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
497 return "Dinkumware STL " + std::to_string(_CPPLIB_VER);
498#elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
499 return "Rogue Wave lib " + std::to_string(_RWSTD_VER);
500#else
501 return "Unknown-STD";
502#endif
503}
504
508inline std::string getExtraLibsVersion() {
509 std::string s;
510
511 // CUDA
512#if defined(CUDA_VERSION)
513 if (!s.empty())
514 s += ", ";
515 s += "CUDA " + std::to_string(CUDA_VERSION);
516#endif
517
518 // HIP
519#if defined(HIP_VERSION)
520 if (!s.empty())
521 s += ", ";
522 s += "HIP " + std::to_string(HIP_VERSION);
523#endif
524
525 // G+Smo
526#if defined(GISMO_VERSION)
527 if (!s.empty())
528 s += ", ";
529 s += "G+Smo " + std::string(GISMO_VERSION);
530#endif
531
532 // LibTorch
533#if defined(TORCH_VERSION_MAJOR)
534 if (!s.empty())
535 s += ", ";
536 s += "LibTorch " + std::to_string(TORCH_VERSION_MAJOR) + "." +
537 std::to_string(TORCH_VERSION_MINOR) + "." +
538 std::to_string(TORCH_VERSION_PATCH);
539#endif
540
541 // Intel MKL library
542#if defined(INTEL_MKL_VERSION)
543 if (!s.empty())
544 s += ", ";
545 s += "MKL " + std::to_string(INTEL_MKL_VERSION);
546#endif
547
548 return s;
549}
550
553inline std::string getCpuInfo() {
554#if defined(_WIN32) || defined(_WIN64)
555
556 int CPUInfo[4] = {-1};
557 unsigned nExIds, i = 0;
558 char CPUBrandString[0x40];
559
560 __cpuid(CPUInfo, 0x80000000);
561 nExIds = CPUInfo[0];
562
563 for (i = 0x80000000; i <= nExIds; ++i) {
564 __cpuid(CPUInfo, i);
565 if (i == 0x80000002)
566 memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
567 else if (i == 0x80000003)
568 memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
569 else if (i == 0x80000004)
570 memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
571 }
572
573 return CPUBrandString;
574
575#elif __APPLE__
576
577 std::string CPUBrandString;
578 std::size_t size = 32;
579
580 // Supply an oversized buffer, and avoid an extra call to sysctlbyname.
581 CPUBrandString.resize(size);
582 if (sysctlbyname("machdep.cpu.brand_string", &CPUBrandString[0], &size,
583 nullptr, 0) == 0 &&
584 size > 0) {
585 if (CPUBrandString[size - 1] == '\0')
586 size--;
587 CPUBrandString.resize(size);
588 return CPUBrandString;
589 }
590
591#elif __linux__ || __unix__
592#if defined(__x86_64__) && (defined(__GNUC__) || defined(__clang__) || \
593 defined(__INTEL_COMPILER) || defined(__SUNCC_PRO))
594
595 char CPUBrandString[0x40];
596 unsigned int CPUInfo[4] = {0, 0, 0, 0};
597
598 __cpuid(0x80000000, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
599 unsigned int nExIds = CPUInfo[0];
600
601 memset(CPUBrandString, 0, sizeof(CPUBrandString));
602
603 for (unsigned int i = 0x80000000; i <= nExIds; ++i) {
604 __cpuid(i, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
605
606 if (i == 0x80000002)
607 memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
608 else if (i == 0x80000003)
609 memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
610 else if (i == 0x80000004)
611 memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
612 }
613
614 return CPUBrandString;
615
616#else
617
618 char hostname[HOST_NAME_MAX + 1];
619 gethostname(hostname, HOST_NAME_MAX + 1);
620
621 std::string str = "Unknown-CPU [";
622 str += hostname;
623 str += "]";
624
625 return str;
626
627#endif
628
629#endif
630
631 return "Unknown-CPU";
632}
633
636inline uint64_t getMemoryInBytes() {
637#if defined(_WIN32) || defined(_WIN64)
638
639 MEMORYSTATUSEX status;
640 status.dwLength = sizeof(status);
641 GlobalMemoryStatusEx(&status);
642 return (uint64_t)status.ullTotalPhys;
643
644#elif __APPLE__
645
646 int64_t memsize;
647 std::size_t size = sizeof(memsize);
648
649 if (sysctlbyname("hw.memsize", &memsize, &size, nullptr, 0) == 0) {
650 return static_cast<uint64_t>(memsize);
651 }
652
653#elif __linux__ || __unix__
654
655 long pages = sysconf(_SC_PHYS_PAGES);
656 long page_size = sysconf(_SC_PAGE_SIZE);
657 return (uint64_t)(pages * page_size);
658
659#endif
660
661 return 0;
662}
663
667inline std::string getMemoryInfo() {
668 uint64_t memsize = getMemoryInBytes();
669 if (memsize > 0) {
670 if (memsize < 1024)
671 return std::to_string(memsize) + " B";
672 else if (memsize < 1024 * 1024)
673 return std::to_string(memsize / 1024) + " KB";
674 else if (memsize < 1024 * 1024 * 1024)
675 return std::to_string(memsize / (1024 * 1024)) + " MB";
676 else
677 return std::to_string(memsize / (1024 * 1024 * 1024)) + " GB";
678 } else
679 return "Unknown-Memory";
680}
681
685inline std::string getVersion() {
686 return std::string("IgANets - Isogeometric Analysis Networks") +
687 " (version " + std::string(getIgANetVersion()) + ")\n" +
688 "Compiled by " +
689 getCompilerVersion() + " (" + getCppVersion() + ", " +
690 getStdLibVersion() + ", " + getExtraLibsVersion() + ")\n" +
691 "Running on " + getCpuInfo() + " (memory " + getMemoryInfo() +
692 ", #intraop threads: " + std::to_string(at::get_num_threads()) +
693 ", #interop threads: " +
694 std::to_string(at::get_num_interop_threads()) + ", devices: CPU" +
695 (torch::cuda::is_available() ? ", CUDA" : "") +
696 (torch::mps::is_available() ? ", MPS" : "") +
697 (torch::xpu::is_available() ? ", XPU" : "") + ")\n";
698}
699
706inline std::filesystem::path getExecutablePath()
707{
708#if defined(_WIN32)
709 char buffer[MAX_PATH];
710 DWORD len = GetModuleFileNameA(NULL, buffer, MAX_PATH);
711 if (len == 0 || len == MAX_PATH)
712 throw std::runtime_error("Failed to get executable path");
713 return std::filesystem::path(buffer).parent_path();
714
715#elif defined(__APPLE__)
716 char buffer[1024];
717 uint32_t size = sizeof(buffer);
718 if (_NSGetExecutablePath(buffer, &size) != 0)
719 throw std::runtime_error("Buffer too small for executable path");
720 return std::filesystem::canonical(buffer).parent_path();
721
722#else // Linux / Unix
723 std::filesystem::path exe = std::filesystem::canonical("/proc/self/exe");
724 return exe.parent_path();
725#endif
726}
727
728} // namespace iganet
Definition core.hpp:73
std::string getCpuInfo()
Returns CPU information.
Definition sysinfo.hpp:553
constexpr std::string_view getIgANetVersion() noexcept
Returns the IgANet version.
Definition sysinfo.hpp:43
std::string getExtraLibsVersion()
Returns the version of extra libraries.
Definition sysinfo.hpp:508
std::string getCompilerVersion()
Returns the version of the compiler.
Definition sysinfo.hpp:50
std::string getCppVersion()
Returns the version of the C++ standard.
Definition sysinfo.hpp:464
std::string getStdLibVersion()
Returns the version of the standard library.
Definition sysinfo.hpp:479
std::filesystem::path getExecutablePath()
Returns the path of the executable.
Definition sysinfo.hpp:706
uint64_t getMemoryInBytes()
Returns total system memory in bytes.
Definition sysinfo.hpp:636
std::string getMemoryInfo()
Returns memory information.
Definition sysinfo.hpp:667
std::string getVersion()
Returns version information.
Definition sysinfo.hpp:685