如何以C ++编程方式获取CPU缓存页面大小?

时间:2008-09-29 19:35:18

标签: c++ windows linux cpu

我希望我的程序能够读取它在C ++中运行的CPU的缓存行大小。

我知道这不能轻松完成,所以我需要一个适用于Linux的解决方案和另一个适用于Windows的解决方案(其他系统的解决方案可能对其他系统有用,所以如果您了解它们就发布它们。)

对于Linux,我可以读取/ proc / cpuinfo的内容并解析以cache_alignment开头的行。也许有一种更好的方式来调用API。

对于Windows,我根本不知道。

7 个答案:

答案 0 :(得分:13)

在Win32上,GetLogicalProcessorInformation会返回SYSTEM_LOGICAL_PROCESSOR_INFORMATION,其中包含CACHE_DESCRIPTOR,其中包含您需要的信息。

答案 1 :(得分:5)

在Linux上试用proccpuinfo library,一个独立于架构的C API,用于读取/ proc / cpuinfo

答案 2 :(得分:4)

对于x86,CPUID指令。快速谷歌搜索显示win32和c ++的一些libraries。我也通过内联汇编程序使用了CPUID。

更多信息:

答案 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上

http://linux.die.net/man/2/getpagesize

答案 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}}。