9#if ALPAKA_OS_WINDOWS || ALPAKA_OS_CYGWIN
13# ifndef WIN32_LEAN_AND_MEAN
14# define WIN32_LEAN_AND_MEAN
18#elif ALPAKA_OS_LINUX || ALPAKA_OS_IOS
19# include <sys/param.h>
20# include <sys/types.h>
25# include <sys/sysctl.h>
39# if ALPAKA_COMP_GNUC || ALPAKA_COMP_CLANG || ALPAKA_COMP_PGI
41# elif ALPAKA_COMP_MSVC || defined(ALPAKA_COMP_MSVC_EMULATED)
52# if ALPAKA_COMP_GNUC || ALPAKA_COMP_CLANG || ALPAKA_COMP_PGI
53 inline auto cpuid(std::uint32_t level, std::uint32_t subfunction, std::uint32_t ex[4]) ->
void
55 __cpuid_count(level, subfunction, ex[0], ex[1], ex[2], ex[3]);
58# elif ALPAKA_COMP_MSVC || defined(ALPAKA_COMP_MSVC_EMULATED)
59 inline auto cpuid(std::uint32_t level, std::uint32_t subfunction, std::uint32_t ex[4]) ->
void
61 __cpuidex(
reinterpret_cast<int*
>(ex), level, subfunction);
64 inline auto cpuid(std::uint32_t, std::uint32_t, std::uint32_t ex[4]) ->
void
71 inline auto cpuid(std::uint32_t, std::uint32_t, std::uint32_t ex[4]) ->
void
81 std::uint32_t ex[4] = {0};
82 cpuid(0x8000'0000, 0, ex);
83 std::uint32_t
const nExIds(ex[0]);
90 return "<unknown: compiler>";
92 return "<unknown: CPU>";
99 char cpuBrandString[0x40] = {0};
100 for(std::uint32_t i(0x8000'0000); i <= nExIds; ++i)
107 std::memcpy(cpuBrandString, ex,
sizeof(ex));
109 else if(i == 0x8000'0003)
111 std::memcpy(cpuBrandString + 16, ex,
sizeof(ex));
113 else if(i == 0x8000'0004)
115 std::memcpy(cpuBrandString + 32, ex,
sizeof(ex));
118 return std::string(cpuBrandString);
120 return std::string(
"unknown");
127#if ALPAKA_OS_WINDOWS || ALPAKA_OS_CYGWIN
130 return si.dwPageSize;
131#elif ALPAKA_OS_LINUX || ALPAKA_OS_IOS
132# if defined(_SC_PAGESIZE)
133 return static_cast<std::size_t
>(sysconf(_SC_PAGESIZE));
136 return static_cast<size_t>(getpagesize());
139# error "getPageSize not implemented for this system!"
150 MEMORYSTATUSEX status;
151 status.dwLength =
sizeof(status);
152 GlobalMemoryStatusEx(&status);
153 return static_cast<std::size_t
>(status.ullTotalPhys);
155#elif ALPAKA_OS_CYGWIN
158 status.dwLength =
sizeof(status);
159 GlobalMemoryStatus(&status);
160 return static_cast<std::size_t
>(status.dwTotalPhys);
162#elif ALPAKA_OS_LINUX || ALPAKA_OS_IOS
165# if defined(CTL_HW) && (defined(HW_MEMSIZE) || defined(HW_PHYSMEM64))
168# if defined(HW_MEMSIZE)
170# elif defined(HW_PHYSMEM64)
174 std::uint64_t size(0);
175 std::size_t sizeLen{
sizeof(size)};
176 if(sysctl(mib, 2, &size, &sizeLen,
nullptr, 0) < 0)
177 throw std::logic_error(
"getGlobalMemCapacityBytes failed calling sysctl!");
178 return static_cast<std::size_t
>(size);
180# elif defined(_SC_AIX_REALMEM)
181 return static_cast<std::size_t
>(sysconf(_SC_AIX_REALMEM)) *
static_cast<std::size_t
>(1024);
183# elif defined(_SC_PHYS_PAGES)
184 return static_cast<std::size_t
>(sysconf(_SC_PHYS_PAGES)) *
getPageSize();
186# elif defined(CTL_HW) \
187 && (defined(HW_PHYSMEM) || defined(HW_REALMEM))
190# if defined(HW_REALMEM)
192# elif defined(HW_PYSMEM)
196 std::uint32_t size(0);
197 std::size_t
const sizeLen{
sizeof(size)};
198 if(sysctl(mib, 2, &size, &sizeLen,
nullptr, 0) < 0)
199 throw std::logic_error(
"getGlobalMemCapacityBytes failed calling sysctl!");
200 return static_cast<std::size_t
>(size);
204# error "getGlobalMemCapacityBytes not implemented for this system!"
213 MEMORYSTATUSEX status;
214 status.dwLength =
sizeof(status);
215 GlobalMemoryStatusEx(&status);
216 return static_cast<std::size_t
>(status.ullAvailPhys);
218# if defined(_SC_AVPHYS_PAGES)
219 return static_cast<std::size_t
>(sysconf(_SC_AVPHYS_PAGES)) *
getPageSize();
222 return static_cast<std::size_t
>(get_avphys_pages()) *
getPageSize();
226 std::size_t len =
sizeof(free_pages);
227 if(sysctlbyname(
"vm.page_free_count", &free_pages, &len,
nullptr, 0) < 0)
229 throw std::logic_error(
"getFreeGlobalMemSizeBytes failed calling sysctl(vm.page_free_count)!");
232 return static_cast<std::size_t
>(free_pages) *
getPageSize();
234# error "getFreeGlobalMemSizeBytes not implemented for this system!"
Functionality which is usable on the host CPU controller thread.
auto cpuid(std::uint32_t, std::uint32_t, std::uint32_t ex[4]) -> void
auto getFreeGlobalMemBytes() -> std::size_t
auto getCpuName() -> std::string
constexpr int UNKNOWN_COMPILER
constexpr int UNKNOWN_CPU
auto getGlobalMemCapacityBytes() -> std::size_t