如何获取每种缓存的数量
how to get number of cache of each sort
我正在编写cpuid程序。我需要帮助获取每种类型缓存的数量。不是它的大小,而是数字。例如,我需要获得如下信息:
一级数据缓存=2 x 64KB。
CPUID会给我每种缓存的大小,但不是它的编号。在MSDN上,我发现GetLogicalProcessorsInformationEx过程可能有助于获得该数字。但我不确定我是否理解正确。我想,CACHE_RELATIONSHIP结构的成员GROUP_AFINITY将与数量有关。有人能给我一些提示吗?或者告诉我其他人能找到这样的信息吗。
我以前做过一个更简单的版本。我没有使用缓存相关性或计数,但我查询了缓存大小和缓存行大小。我怀疑这些信息可以通过交换我所做的一些争论来获得。
以下是我在普通PC平台上获得最大CPU缓存大小的方法。我在windows(msvc,mingw)、Linux(gcc,clang)和Mac OS X(gcc)上运行过这个程序,在那里它编译和运行时没有任何警告,除了msvc发出的一些看似虚假的警告。此代码来自https://github.com/BlackToppStudios/DAGFrameScheduler/blob/master/src/systemcalls.cpp,但您可以出于自己的目的使用此功能(我是作者/所有者,可以从GPL中重新授权它)。
它检查L4缓存是否存在,如果存在则返回。然后它检查L3缓存是否存在;如果存在,则返回,然后L2和L1也一样。
此代码期望_MEZZ_THREAD_WIN32_仅在windows上定义,_MEZZ_THREAD_APPLE_仅在Mac OS X上定义,并假定Linux/BSD为其他情况。截至撰写本文前6周,MinGW在这方面存在问题,可能会使用msvc/windows-sdk标头和c库,但我没有尝试过,这似乎很混乱。
#ifdef _MEZZ_THREAD_WIN32_
#include <windows.h>
#else
#ifdef _MEZZ_THREAD_APPLE_
#include <sys/sysctl.h>
#endif
#include <sys/time.h>
#include <unistd.h>
#endif
typedef unsigned int Whole
Whole GetCacheSize()
{
#ifdef _MEZZ_THREAD_WIN32_
#ifdef _MSC_VER
size_t Size = 0;
DWORD buffer_size = 0;
DWORD i = 0;
SYSTEM_LOGICAL_PROCESSOR_INFORMATION * buffer = 0;
GetLogicalProcessorInformation(0, &buffer_size);
buffer = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION *)malloc(buffer_size);
GetLogicalProcessorInformation(&buffer[0], &buffer_size);
for (i = 0; i != buffer_size / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); ++i) {
if (buffer[i].Relationship == RelationCache && buffer[i].Cache.Level == 1) {
Size = buffer[i].Cache.Size;
break;
}
}
free(buffer);
return Size;
#else
//mingw can't do this, see bug http://sourceforge.net/p/mingw/bugs/1626/
// assume 32k
return 32768;
#endif
#else
#ifdef _MEZZ_THREAD_APPLE_
Whole CacheSize;
Whole CSSize = sizeof(CacheSize);
if(0==sysctlbyname("hw.l4icachesize", &CacheSize, &CSSize, NULL, 0))
{
return CacheSize;
}else{
if(0==sysctlbyname("hw.l3icachesize", &CacheSize, &CSSize, NULL, 0))
{
return CacheSize;
}else{
if(0==sysctlbyname("hw.l2icachesize", &CacheSize, &CSSize, NULL, 0))
{
return CacheSize;
}else{
if(0==sysctlbyname("hw.l1icachesize", &CacheSize, &CSSize, NULL, 0))
{
return CacheSize;
}else{
return 0;
}
}
}
}
#else
Whole CSSize = sysconf(_SC_LEVEL4_CACHE_SIZE);
if(!CSSize)
{
CSSize = sysconf(_SC_LEVEL3_CACHE_SIZE);
if(!CSSize)
{
CSSize = sysconf(_SC_LEVEL2_CACHE_SIZE);
if(!CSSize)
{ CSSize = sysconf(_SC_LEVEL1_DCACHE_SIZE); }
}
}
return CSSize;
#endif
#endif
}
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取英特尔 Kaby Lake 架构上最后一级高速缓存未命中计数的确切代码是什么?
- 如何指定创建文件函数获取未缓存的结果?
- 如何在 Linux 下C++获取缓冲/缓存内存大小
- 如何获取每种缓存的数量
- 正在获取寄存器/缓存中的当前值
- 如何通过ODBC从系统间缓存db获取数据
- JNI:给定jobject,获取它的缓存方法