57#define COMPILER_ID "Comeau"
59#define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
60#define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
62#elif defined(__INTEL_COMPILER) || defined(__ICC)
63#define COMPILER_ID "Intel"
65#define SIMULATE_ID "MSVC"
68#define SIMULATE_ID "GNU"
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)
79#define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
82#define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER)
83#define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE)
86#define COMPILER_VERSION_PATCH DEC(0)
88#if defined(__INTEL_COMPILER_BUILD_DATE)
90#define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
94#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
95#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
98#define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
99#elif defined(__GNUG__)
100#define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
102#if defined(__GNUC_MINOR__)
103#define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
105#if defined(__GNUC_PATCHLEVEL__)
106#define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
109#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || \
110 defined(__INTEL_LLVM_COMPILER)
111#define COMPILER_ID "IntelLLVM"
113#define SIMULATE_ID "MSVC"
116#define SIMULATE_ID "GNU"
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)
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)
133#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
134#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
137#define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
138#elif defined(__GNUG__)
139#define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
141#if defined(__GNUC_MINOR__)
142#define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
144#if defined(__GNUC_PATCHLEVEL__)
145#define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
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__)
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)
162#elif defined(__BORLANDC__)
163#define COMPILER_ID "Borland"
165#define COMPILER_VERSION_MAJOR HEX(__BORLANDC__ >> 8)
166#define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
168#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
169#define COMPILER_ID "Watcom"
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)
177#elif defined(__WATCOMC__)
178#define COMPILER_ID "OpenWatcom"
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)
186#elif defined(__SUNPRO_CC)
187#define COMPILER_ID "SunPro"
188#if __SUNPRO_CC >= 0x5100
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)
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)
200#elif defined(__HP_aCC)
201#define COMPILER_ID "HP"
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)
207#elif defined(__DECCXX)
208#define COMPILER_ID "Compaq"
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)
214#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
215#define COMPILER_ID "zOS"
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)
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__)
228#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
229#define COMPILER_ID "XL"
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)
235#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
236#define COMPILER_ID "VisualAge"
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)
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__)
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__)
259#define COMPILER_ID "Cray"
260#define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
261#define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
263#elif defined(__TI_COMPILER_VERSION__)
264#define COMPILER_ID "TI"
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)
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__
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__)
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)
292#elif defined(__ghs__)
293#define COMPILER_ID "GHS"
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)
301#elif defined(__SCO_VERSION__)
302#define COMPILER_ID "SCO"
304#elif defined(__ARMCC_VERSION) && !defined(__clang__)
305#define COMPILER_ID "ARMCC"
306#if __ARMCC_VERSION >= 1000000
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)
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)
318#elif defined(__clang__) && defined(__apple_build_version__)
319#define COMPILER_ID "AppleClang"
321#define SIMULATE_ID "MSVC"
323#define COMPILER_VERSION_MAJOR DEC(__clang_major__)
324#define COMPILER_VERSION_MINOR DEC(__clang_minor__)
325#define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
328#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
329#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
331#define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
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)
340#elif defined(__clang__)
341#define COMPILER_ID "Clang"
343#define SIMULATE_ID "MSVC"
345#define COMPILER_VERSION_MAJOR DEC(__clang_major__)
346#define COMPILER_VERSION_MINOR DEC(__clang_minor__)
347#define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
350#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
351#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
354#elif defined(__GNUC__) || defined(__GNUG__)
355#define COMPILER_ID "GNU"
357#define COMPILER_VERSION_MAJOR DEC(__GNUC__)
359#define COMPILER_VERSION_MAJOR DEC(__GNUG__)
361#if defined(__GNUC_MINOR__)
362#define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
364#if defined(__GNUC_PATCHLEVEL__)
365#define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
368#elif defined(_MSC_VER)
369#define COMPILER_ID "MSVC"
371#define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
372#define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
373#if defined(_MSC_FULL_VER)
376#define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
379#define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
382#if defined(_MSC_BUILD)
383#define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
386#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || \
387 defined(__ADSPTS__) || defined(__ADSP21000__)
388#define COMPILER_ID "ADSP"
389#if defined(__VISUALDSPVERSION__)
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)
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__)
416#elif defined(__hpux) || defined(__hpua)
417#define COMPILER_ID "HP"
420#define COMPILER_ID "Unknown-Compiler"
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)
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
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)
479#elif defined(__MSL_CPP__)
480 return "MSL standard lib";
481#elif defined(__IBMCPP__)
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);
490 return "Unknown-STD";
499#if defined(CUDA_VERSION)
502 s +=
"CUDA " + std::to_string(CUDA_VERSION);
506#if defined(HIP_VERSION)
509 s +=
"HIP " + std::to_string(HIP_VERSION);
513#if defined(GISMO_VERSION)
516 s +=
"G+Smo " + std::string(GISMO_VERSION);
520#if defined(TORCH_VERSION_MAJOR)
523 s +=
"LibTorch " + std::to_string(TORCH_VERSION_MAJOR) +
"." +
524 std::to_string(TORCH_VERSION_MINOR) +
"." +
525 std::to_string(TORCH_VERSION_PATCH);
529#if defined(INTEL_MKL_VERSION)
532 s +=
"MKL " + std::to_string(INTEL_MKL_VERSION);
540#if defined(_WIN32) || defined(_WIN64)
542 int CPUInfo[4] = {-1};
543 unsigned nExIds, i = 0;
544 char CPUBrandString[0x40];
546 __cpuid(CPUInfo, 0x80000000);
549 for (i = 0x80000000; i <= nExIds; ++i) {
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));
559 return CPUBrandString;
563 std::string CPUBrandString;
564 std::size_t size = 32;
567 CPUBrandString.resize(size);
568 if (sysctlbyname(
"machdep.cpu.brand_string", &CPUBrandString[0], &size,
571 if (CPUBrandString[size - 1] ==
'\0')
573 CPUBrandString.resize(size);
574 return CPUBrandString;
577#elif __linux__ || __unix__
578#if defined(__x86_64__) && (defined(__GNUC__) || defined(__clang__) || \
579 defined(__INTEL_COMPILER) || defined(__SUNCC_PRO))
581 char CPUBrandString[0x40];
582 unsigned int CPUInfo[4] = {0, 0, 0, 0};
584 __cpuid(0x80000000, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
585 unsigned int nExIds = CPUInfo[0];
587 memset(CPUBrandString, 0,
sizeof(CPUBrandString));
589 for (
unsigned int i = 0x80000000; i <= nExIds; ++i) {
590 __cpuid(i, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
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));
600 return CPUBrandString;
604 char hostname[HOST_NAME_MAX + 1];
605 gethostname(hostname, HOST_NAME_MAX + 1);
607 std::string str =
"Unknown-CPU [";
617 return "Unknown-CPU";
622#if defined(_WIN32) || defined(_WIN64)
624 MEMORYSTATUSEX status;
625 status.dwLength =
sizeof(status);
626 GlobalMemoryStatusEx(&status);
627 return (uint64_t)status.ullTotalPhys;
632 std::size_t size =
sizeof(memsize);
634 if (sysctlbyname(
"hw.memsize", &memsize, &size,
nullptr, 0) == 0) {
635 return static_cast<uint64_t
>(memsize);
638#elif __linux__ || __unix__
640 long pages = sysconf(_SC_PHYS_PAGES);
641 long page_size = sysconf(_SC_PAGE_SIZE);
642 return (uint64_t)(pages * page_size);
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";
660 return std::to_string(memsize / (1024 * 1024 * 1024)) +
" GB";
662 return "Unknown-Memory";
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();
690#elif defined(__APPLE__)
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();
698 std::filesystem::path exe = std::filesystem::canonical(
"/proc/self/exe");
699 return exe.parent_path();