14#if defined(_POSIX_C_SOURCE) && defined(_SC_LEVEL1_DCACHE_LINESIZE)
16 long val = ::sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
30 unsigned long geometry = getauxval(AT_L1D_CACHEGEOMETRY);
31 if (geometry == 0 && errno == ENOENT)
42#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
43 defined(__DragonFly__) || defined(__APPLE__)
45#include <sys/sysctl.h>
50 if (sysctlbyname(
"hw.cachelinesize", &val, &size, NULL, 0) != 0)
60#if defined(_WIN32) || defined(_WIN64)
65static std::optional<int64_t>
67 DWORD buffer_size = 0;
68 GetLogicalProcessorInformation(
nullptr, &buffer_size);
69 assert(buffer_size %
sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) == 0);
70 std::vector<SYSTEM_LOGICAL_PROCESSOR_INFORMATION> buffer(
71 buffer_size /
sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION));
72 GetLogicalProcessorInformation(buffer.data(), &buffer_size);
73 for (
const auto& e : buffer) {
74 if (e.Relationship == RelationCache && e.Cache.Level == 1 &&
75 e.Cache.Type == CacheData) {
76 return e.Cache.LineSize;
82static std::optional<int64_t>
89 std::optional<int64_t> val;
107 <<
"Do not know how to query CPU L1d cache line size for this system!"
111 std::cout << *val << std::endl;
assert(dim.area() >=area)
static std::optional< int64_t > get_cachelinesize_from_GetLogicalProcessorInformation()
static std::optional< int64_t > get_cachelinesize_from_sysctlbyname()
static std::optional< int64_t > get_cachelinesize_from_sysconf()
static std::optional< int64_t > get_cachelinesize_from_getauxval()