64#define COMPILER_ID "Comeau"
66#define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
67#define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
69#elif defined(__INTEL_COMPILER) || defined(__ICC)
70#define COMPILER_ID "Intel"
72#define SIMULATE_ID "MSVC"
75#define SIMULATE_ID "GNU"
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)
86#define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
89#define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER)
90#define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE)
93#define COMPILER_VERSION_PATCH DEC(0)
95#if defined(__INTEL_COMPILER_BUILD_DATE)
97#define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
101#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
102#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
105#define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
106#elif defined(__GNUG__)
107#define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
109#if defined(__GNUC_MINOR__)
110#define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
112#if defined(__GNUC_PATCHLEVEL__)
113#define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
116#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || \
117 defined(__INTEL_LLVM_COMPILER)
118#define COMPILER_ID "IntelLLVM"
120#define SIMULATE_ID "MSVC"
123#define SIMULATE_ID "GNU"
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)
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)
140#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
141#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
144#define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
145#elif defined(__GNUG__)
146#define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
148#if defined(__GNUC_MINOR__)
149#define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
151#if defined(__GNUC_PATCHLEVEL__)
152#define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
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__)
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)
169#elif defined(__BORLANDC__)
170#define COMPILER_ID "Borland"
172#define COMPILER_VERSION_MAJOR HEX(__BORLANDC__ >> 8)
173#define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
175#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
176#define COMPILER_ID "Watcom"
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)
184#elif defined(__WATCOMC__)
185#define COMPILER_ID "OpenWatcom"
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)
193#elif defined(__SUNPRO_CC)
194#define COMPILER_ID "SunPro"
195#if __SUNPRO_CC >= 0x5100
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)
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)
207#elif defined(__HP_aCC)
208#define COMPILER_ID "HP"
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)
214#elif defined(__DECCXX)
215#define COMPILER_ID "Compaq"
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)
221#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
222#define COMPILER_ID "zOS"
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)
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__)
235#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
236#define COMPILER_ID "XL"
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(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
243#define COMPILER_ID "VisualAge"
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)
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__)
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__)
266#define COMPILER_ID "Cray"
267#define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
268#define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
270#elif defined(__TI_COMPILER_VERSION__)
271#define COMPILER_ID "TI"
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)
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__
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__)
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)
299#elif defined(__ghs__)
300#define COMPILER_ID "GHS"
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)
308#elif defined(__SCO_VERSION__)
309#define COMPILER_ID "SCO"
311#elif defined(__ARMCC_VERSION) && !defined(__clang__)
312#define COMPILER_ID "ARMCC"
313#if __ARMCC_VERSION >= 1000000
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)
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)
325#elif defined(__clang__) && defined(__apple_build_version__)
326#define COMPILER_ID "AppleClang"
328#define SIMULATE_ID "MSVC"
330#define COMPILER_VERSION_MAJOR DEC(__clang_major__)
331#define COMPILER_VERSION_MINOR DEC(__clang_minor__)
332#define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
335#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
336#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
338#define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
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)
347#elif defined(__clang__)
348#define COMPILER_ID "Clang"
350#define SIMULATE_ID "MSVC"
352#define COMPILER_VERSION_MAJOR DEC(__clang_major__)
353#define COMPILER_VERSION_MINOR DEC(__clang_minor__)
354#define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
357#define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
358#define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
361#elif defined(__GNUC__) || defined(__GNUG__)
362#define COMPILER_ID "GNU"
364#define COMPILER_VERSION_MAJOR DEC(__GNUC__)
366#define COMPILER_VERSION_MAJOR DEC(__GNUG__)
368#if defined(__GNUC_MINOR__)
369#define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
371#if defined(__GNUC_PATCHLEVEL__)
372#define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
375#elif defined(_MSC_VER)
376#define COMPILER_ID "MSVC"
378#define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
379#define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
380#if defined(_MSC_FULL_VER)
383#define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
386#define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
389#if defined(_MSC_BUILD)
390#define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
393#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || \
394 defined(__ADSPTS__) || defined(__ADSP21000__)
395#define COMPILER_ID "ADSP"
396#if defined(__VISUALDSPVERSION__)
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)
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__)
423#elif defined(__hpux) || defined(__hpua)
424#define COMPILER_ID "HP"
427#define COMPILER_ID "Unknown-Compiler"
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)
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
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)
490#elif defined(__MSL_CPP__)
491 return "MSL standard lib";
492#elif defined(__IBMCPP__)
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);
501 return "Unknown-STD";
512#if defined(CUDA_VERSION)
515 s +=
"CUDA " + std::to_string(CUDA_VERSION);
519#if defined(HIP_VERSION)
522 s +=
"HIP " + std::to_string(HIP_VERSION);
526#if defined(GISMO_VERSION)
529 s +=
"G+Smo " + std::string(GISMO_VERSION);
533#if defined(TORCH_VERSION_MAJOR)
536 s +=
"LibTorch " + std::to_string(TORCH_VERSION_MAJOR) +
"." +
537 std::to_string(TORCH_VERSION_MINOR) +
"." +
538 std::to_string(TORCH_VERSION_PATCH);
542#if defined(INTEL_MKL_VERSION)
545 s +=
"MKL " + std::to_string(INTEL_MKL_VERSION);
554#if defined(_WIN32) || defined(_WIN64)
556 int CPUInfo[4] = {-1};
557 unsigned nExIds, i = 0;
558 char CPUBrandString[0x40];
560 __cpuid(CPUInfo, 0x80000000);
563 for (i = 0x80000000; i <= nExIds; ++i) {
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));
573 return CPUBrandString;
577 std::string CPUBrandString;
578 std::size_t size = 32;
581 CPUBrandString.resize(size);
582 if (sysctlbyname(
"machdep.cpu.brand_string", &CPUBrandString[0], &size,
585 if (CPUBrandString[size - 1] ==
'\0')
587 CPUBrandString.resize(size);
588 return CPUBrandString;
591#elif __linux__ || __unix__
592#if defined(__x86_64__) && (defined(__GNUC__) || defined(__clang__) || \
593 defined(__INTEL_COMPILER) || defined(__SUNCC_PRO))
595 char CPUBrandString[0x40];
596 unsigned int CPUInfo[4] = {0, 0, 0, 0};
598 __cpuid(0x80000000, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
599 unsigned int nExIds = CPUInfo[0];
601 memset(CPUBrandString, 0,
sizeof(CPUBrandString));
603 for (
unsigned int i = 0x80000000; i <= nExIds; ++i) {
604 __cpuid(i, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
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));
614 return CPUBrandString;
618 char hostname[HOST_NAME_MAX + 1];
619 gethostname(hostname, HOST_NAME_MAX + 1);
621 std::string str =
"Unknown-CPU [";
631 return "Unknown-CPU";
637#if defined(_WIN32) || defined(_WIN64)
639 MEMORYSTATUSEX status;
640 status.dwLength =
sizeof(status);
641 GlobalMemoryStatusEx(&status);
642 return (uint64_t)status.ullTotalPhys;
647 std::size_t size =
sizeof(memsize);
649 if (sysctlbyname(
"hw.memsize", &memsize, &size,
nullptr, 0) == 0) {
650 return static_cast<uint64_t
>(memsize);
653#elif __linux__ || __unix__
655 long pages = sysconf(_SC_PHYS_PAGES);
656 long page_size = sysconf(_SC_PAGE_SIZE);
657 return (uint64_t)(pages * page_size);
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";
677 return std::to_string(memsize / (1024 * 1024 * 1024)) +
" GB";
679 return "Unknown-Memory";
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();
715#elif defined(__APPLE__)
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();
723 std::filesystem::path exe = std::filesystem::canonical(
"/proc/self/exe");
724 return exe.parent_path();