我希望我的程序能够读取它在C ++中运行的CPU的缓存行大小。
我知道这不能轻松完成,所以我需要一个适用于Linux的解决方案和另一个适用于Windows的解决方案(其他系统的解决方案可能对其他系统有用,所以如果您了解它们就发布它们。)
对于Linux,我可以读取/ proc / cpuinfo的内容并解析以cache_alignment开头的行。也许有一种更好的方式来调用API。
对于Windows,我根本不知道。
答案 0 :(得分:13)
在Win32上,GetLogicalProcessorInformation
会返回SYSTEM_LOGICAL_PROCESSOR_INFORMATION
,其中包含CACHE_DESCRIPTOR
,其中包含您需要的信息。
答案 1 :(得分:5)
在Linux上试用proccpuinfo library,一个独立于架构的C API,用于读取/ proc / cpuinfo
答案 2 :(得分:4)
答案 3 :(得分:4)
在Windows上
#include <Windows.h>
#include <iostream>
using std::cout; using std::endl;
int main()
{
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
cout << "Page Size Is: " << systemInfo.dwPageSize;
getchar();
}
在Linux上
答案 4 :(得分:2)
看起来至少SCO unix(http://uw714doc.sco.com/en/man/html.3C/sysconf.3C.html)对于sysconf有_SC_CACHE_LINE。也许其他平台有类似的东西?
答案 5 :(得分:1)
以下是一些示例代码,供那些想知道如何在公认的答案中利用该功能的人
#include <new>
#include <iostream>
#include <Windows.h>
void ShowCacheSize()
{
using CPUInfo = SYSTEM_LOGICAL_PROCESSOR_INFORMATION;
DWORD len = 0;
CPUInfo* buffer = nullptr;
// Determine required length of a buffer
if ((GetLogicalProcessorInformation(buffer, &len) == FALSE) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER))
{
// Allocate buffer of required size
buffer = new (std::nothrow) CPUInfo[len]{ };
if (buffer == nullptr)
{
std::cout << "Buffer allocation of " << len << " bytes failed" << std::endl;
}
else if (GetLogicalProcessorInformation(buffer, &len) != FALSE)
{
for (DWORD i = 0; i < len; ++i)
{
// This will be true for multiple returned caches, we need just one
if (buffer[i].Relationship == RelationCache)
{
std::cout << "Cache line size is: " << buffer[i].Cache.LineSize << " bytes" << std::endl;
break;
}
}
}
else
{
std::cout << "ERROR: " << GetLastError() << std::endl;
}
delete[] buffer;
}
}
答案 6 :(得分:0)
我认为您需要来自ntdll.dll
的{{3}}。