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