53#define COMPILER_ID "Comeau"
55#define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
56#define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
58#elif defined(__INTEL_COMPILER) || defined(__ICC)
59#define COMPILER_ID "Intel"
61#define SIMULATE_ID "MSVC"
64#define SIMULATE_ID "GNU"
68#if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || \
69 __INTEL_COMPILER == 202111
70#define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER / 100)
71#define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER / 10 % 10)
72#if defined(__INTEL_COMPILER_UPDATE)
73#define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
75#define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
78#define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER)
79#define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE)
82#define COMPILER_VERSION_PATCH DEC(0)
84#if defined(__INTEL_COMPILER_BUILD_DATE)
86#define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
90#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
91#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
94#define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
95#elif defined(__GNUG__)
96#define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
98#if defined(__GNUC_MINOR__)
99#define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
101#if defined(__GNUC_PATCHLEVEL__)
102#define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
105#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || \
106 defined(__INTEL_LLVM_COMPILER)
107#define COMPILER_ID "IntelLLVM"
109#define SIMULATE_ID "MSVC"
112#define SIMULATE_ID "GNU"
118#if __INTEL_LLVM_COMPILER < 1000000L
119#define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER / 100)
120#define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER / 10 % 10)
121#define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10)
123#define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER / 10000)
124#define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER / 100 % 100)
125#define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100)
129#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
130#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
133#define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
134#elif defined(__GNUG__)
135#define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
137#if defined(__GNUC_MINOR__)
138#define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
140#if defined(__GNUC_PATCHLEVEL__)
141#define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
144#elif defined(__PATHCC__)
145#define COMPILER_ID "PathScale"
146#define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
147#define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
148#if defined(__PATHCC_PATCHLEVEL__)
149#define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
152#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
153#define COMPILER_ID "Embarcadero"
154#define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__ >> 24 & 0x00FF)
155#define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__ >> 16 & 0x00FF)
156#define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
158#elif defined(__BORLANDC__)
159#define COMPILER_ID "Borland"
161#define COMPILER_VERSION_MAJOR HEX(__BORLANDC__ >> 8)
162#define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
164#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
165#define COMPILER_ID "Watcom"
167#define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
168#define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
169#if (__WATCOMC__ % 10) > 0
170#define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
173#elif defined(__WATCOMC__)
174#define COMPILER_ID "OpenWatcom"
176#define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
177#define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
178#if (__WATCOMC__ % 10) > 0
179#define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
182#elif defined(__SUNPRO_CC)
183#define COMPILER_ID "SunPro"
184#if __SUNPRO_CC >= 0x5100
186#define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC >> 12)
187#define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC >> 4 & 0xFF)
188#define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
191#define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC >> 8)
192#define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC >> 4 & 0xF)
193#define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
196#elif defined(__HP_aCC)
197#define COMPILER_ID "HP"
199#define COMPILER_VERSION_MAJOR DEC(__HP_aCC / 10000)
200#define COMPILER_VERSION_MINOR DEC(__HP_aCC / 100 % 100)
201#define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
203#elif defined(__DECCXX)
204#define COMPILER_ID "Compaq"
206#define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER / 10000000)
207#define COMPILER_VERSION_MINOR DEC(__DECCXX_VER / 100000 % 100)
208#define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
210#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
211#define COMPILER_ID "zOS"
213#define COMPILER_VERSION_MAJOR DEC(__IBMCPP__ / 100)
214#define COMPILER_VERSION_MINOR DEC(__IBMCPP__ / 10 % 10)
215#define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
217#elif defined(__ibmxl__) && defined(__clang__)
218#define COMPILER_ID "XLClang"
219#define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
220#define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
221#define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
222#define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
224#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
225#define COMPILER_ID "XL"
227#define COMPILER_VERSION_MAJOR DEC(__IBMCPP__ / 100)
228#define COMPILER_VERSION_MINOR DEC(__IBMCPP__ / 10 % 10)
229#define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
231#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
232#define COMPILER_ID "VisualAge"
234#define COMPILER_VERSION_MAJOR DEC(__IBMCPP__ / 100)
235#define COMPILER_VERSION_MINOR DEC(__IBMCPP__ / 10 % 10)
236#define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
238#elif defined(__NVCOMPILER)
239#define COMPILER_ID "NVHPC"
240#define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__)
241#define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__)
242#if defined(__NVCOMPILER_PATCHLEVEL__)
243#define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__)
247#define COMPILER_ID "PGI"
248#define COMPILER_VERSION_MAJOR DEC(__PGIC__)
249#define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
250#if defined(__PGIC_PATCHLEVEL__)
251#define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
255#define COMPILER_ID "Cray"
256#define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
257#define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
259#elif defined(__TI_COMPILER_VERSION__)
260#define COMPILER_ID "TI"
262#define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__ / 1000000)
263#define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__ / 1000 % 1000)
264#define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
266#elif defined(__CLANG_FUJITSU)
267#define COMPILER_ID "FujitsuClang"
268#define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
269#define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
270#define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
271#define COMPILER_VERSION_INTERNAL_STR __clang_version__
273#elif defined(__FUJITSU)
274#define COMPILER_ID "Fujitsu"
275#if defined(__FCC_version__)
276#define COMPILER_VERSION __FCC_version__
277#elif defined(__FCC_major__)
278#define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
279#define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
280#define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
282#if defined(__fcc_version)
283#define COMPILER_VERSION_INTERNAL DEC(__fcc_version)
284#elif defined(__FCC_VERSION)
285#define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION)
288#elif defined(__ghs__)
289#define COMPILER_ID "GHS"
291#ifdef __GHS_VERSION_NUMBER
292#define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
293#define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
294#define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
297#elif defined(__SCO_VERSION__)
298#define COMPILER_ID "SCO"
300#elif defined(__ARMCC_VERSION) && !defined(__clang__)
301#define COMPILER_ID "ARMCC"
302#if __ARMCC_VERSION >= 1000000
304#define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION / 1000000)
305#define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION / 10000 % 100)
306#define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
309#define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION / 100000)
310#define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION / 10000 % 10)
311#define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
314#elif defined(__clang__) && defined(__apple_build_version__)
315#define COMPILER_ID "AppleClang"
317#define SIMULATE_ID "MSVC"
319#define COMPILER_VERSION_MAJOR DEC(__clang_major__)
320#define COMPILER_VERSION_MINOR DEC(__clang_minor__)
321#define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
324#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
325#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
327#define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
329#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION)
330#define COMPILER_ID "ARMClang"
331#define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION / 1000000)
332#define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION / 10000 % 100)
333#define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000)
334#define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION)
336#elif defined(__clang__)
337#define COMPILER_ID "Clang"
339#define SIMULATE_ID "MSVC"
341#define COMPILER_VERSION_MAJOR DEC(__clang_major__)
342#define COMPILER_VERSION_MINOR DEC(__clang_minor__)
343#define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
346#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
347#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
350#elif defined(__GNUC__) || defined(__GNUG__)
351#define COMPILER_ID "GNU"
353#define COMPILER_VERSION_MAJOR DEC(__GNUC__)
355#define COMPILER_VERSION_MAJOR DEC(__GNUG__)
357#if defined(__GNUC_MINOR__)
358#define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
360#if defined(__GNUC_PATCHLEVEL__)
361#define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
364#elif defined(_MSC_VER)
365#define COMPILER_ID "MSVC"
367#define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
368#define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
369#if defined(_MSC_FULL_VER)
372#define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
375#define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
378#if defined(_MSC_BUILD)
379#define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
382#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || \
383 defined(__ADSPTS__) || defined(__ADSP21000__)
384#define COMPILER_ID "ADSP"
385#if defined(__VISUALDSPVERSION__)
387#define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__ >> 24)
388#define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__ >> 16 & 0xFF)
389#define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__ >> 8 & 0xFF)
392#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
393#define COMPILER_ID "IAR"
394#if defined(__VER__) && defined(__ICCARM__)
395#define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
396#define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
397#define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
398#define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
399#elif defined(__VER__) && \
400 (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || \
401 defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || \
402 defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__))
403#define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
404#define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100) * 100))
405#define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
406#define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
412#elif defined(__hpux) || defined(__hpua)
413#define COMPILER_ID "HP"
416#define COMPILER_ID "Unknown-Compiler"
420#ifdef COMPILER_VERSION
421 +
" " + std::to_string(COMPILER_VERSION);
422#elif defined(COMPILER_VERSION_MAJOR)
423 +
" " + std::to_string(COMPILER_VERSION_MAJOR)
424#ifdef COMPILER_VERSION_MINOR
425 +
"." + std::to_string(COMPILER_VERSION_MINOR)
426#ifdef COMPILER_VERSION_PATCH
427 +
"." + std::to_string(COMPILER_VERSION_PATCH)
428#ifdef COMPILER_VERSION_TWEAK
429 +
"." + std::to_string(COMPILER_VERSION_TWEAK)
439#undef COMPILER_VERSION
440#undef COMPILER_VERSION_MAJOR
441#undef COMPILER_VERSION_MINOR
442#undef COMPILER_VERSION_PATCH
443#undef COMPILER_VERSION_TWEAK
444#undef SIMULATE_VERSION_MAJOR
445#undef SIMULATE_VERSION_MINOR
446#undef SIMULATE_VERSION_PATCH
447#undef SIMULATE_VERSION_TWEAK
465#ifdef _LIBCPP_VERSION
466 return "libc++ " + std::to_string(_LIBCPP_VERSION);
467#elif defined(__GLIBCXX__)
468 return "glibc++ " + std::to_string(__GLIBCXX__);
469#elif defined(__GLIBCPP__)
470 return "glibc++ " + std::to_string(__GLIBCPP__);
471#elif defined(__LIBCOMO__)
472 return "Comeau STL " + std::to_string(__LIBCOMO__);
473#elif defined(__STL_CONFIG_H)
475#elif defined(__MSL_CPP__)
476 return "MSL standard lib";
477#elif defined(__IBMCPP__)
479#elif defined(MSIPL_COMPILE_H)
480 return "Modena C++ STL";
481#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
482 return "Dinkumware STL " + std::to_string(_CPPLIB_VER);
483#elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
484 return "Rogue Wave lib " + std::to_string(_RWSTD_VER);
486 return "Unknown-STD";
495#if defined(CUDA_VERSION)
498 s +=
"CUDA " + std::to_string(CUDA_VERSION);
502#if defined(HIP_VERSION)
505 s +=
"HIP " + std::to_string(HIP_VERSION);
509#if defined(GISMO_VERSION)
512 s +=
"G+Smo " + std::string(GISMO_VERSION);
516#if defined(TORCH_VERSION_MAJOR)
519 s +=
"LibTorch " + std::to_string(TORCH_VERSION_MAJOR) +
"." +
520 std::to_string(TORCH_VERSION_MINOR) +
"." +
521 std::to_string(TORCH_VERSION_PATCH);
525#if defined(INTEL_MKL_VERSION)
528 s +=
"MKL " + std::to_string(INTEL_MKL_VERSION);
536#if defined(_WIN32) || defined(_WIN64)
538 int CPUInfo[4] = {-1};
539 unsigned nExIds, i = 0;
540 char CPUBrandString[0x40];
542 __cpuid(CPUInfo, 0x80000000);
545 for (i = 0x80000000; i <= nExIds; ++i) {
548 memcpy(CPUBrandString, CPUInfo,
sizeof(CPUInfo));
549 else if (i == 0x80000003)
550 memcpy(CPUBrandString + 16, CPUInfo,
sizeof(CPUInfo));
551 else if (i == 0x80000004)
552 memcpy(CPUBrandString + 32, CPUInfo,
sizeof(CPUInfo));
555 return CPUBrandString;
559 std::string CPUBrandString;
560 std::size_t size = 32;
563 CPUBrandString.resize(size);
564 if (sysctlbyname(
"machdep.cpu.brand_string", &CPUBrandString[0], &size, NULL,
567 if (CPUBrandString[size - 1] ==
'\0')
569 CPUBrandString.resize(size);
570 return CPUBrandString;
573#elif __linux__ || __unix__
574#if defined(__x86_64__) && (defined(__GNUC__) || defined(__clang__) || \
575 defined(__INTEL_COMPILER) || defined(__SUNCC_PRO))
577 char CPUBrandString[0x40];
578 unsigned int CPUInfo[4] = {0, 0, 0, 0};
580 __cpuid(0x80000000, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
581 unsigned int nExIds = CPUInfo[0];
583 memset(CPUBrandString, 0,
sizeof(CPUBrandString));
585 for (
unsigned int i = 0x80000000; i <= nExIds; ++i) {
586 __cpuid(i, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
589 memcpy(CPUBrandString, CPUInfo,
sizeof(CPUInfo));
590 else if (i == 0x80000003)
591 memcpy(CPUBrandString + 16, CPUInfo,
sizeof(CPUInfo));
592 else if (i == 0x80000004)
593 memcpy(CPUBrandString + 32, CPUInfo,
sizeof(CPUInfo));
596 return CPUBrandString;
600 char hostname[HOST_NAME_MAX + 1];
601 gethostname(hostname, HOST_NAME_MAX + 1);
603 std::string str =
"Unknown-CPU [";
613 return "Unknown-CPU";
618#if defined(_WIN32) || defined(_WIN64)
620 MEMORYSTATUSEX status;
621 status.dwLength =
sizeof(status);
622 GlobalMemoryStatusEx(&status);
623 return (uint64_t)status.ullTotalPhys;
628 std::size_t size =
sizeof(memsize);
630 if (sysctlbyname(
"hw.memsize", &memsize, &size, NULL, 0) == 0) {
631 return (uint64_t)memsize;
634#elif __linux__ || __unix__
636 long pages = sysconf(_SC_PHYS_PAGES);
637 long page_size = sysconf(_SC_PAGE_SIZE);
638 return (uint64_t)(pages * page_size);
650 return std::to_string(memsize) +
" B";
651 else if (memsize < 1024 * 1024)
652 return std::to_string(memsize / 1024) +
" KB";
653 else if (memsize < 1024 * 1024 * 1024)
654 return std::to_string(memsize / (1024 * 1024)) +
" MB";
656 return std::to_string(memsize / (1024 * 1024 * 1024)) +
" GB";
658 return "Unknown-Memory";