C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 获取共享缓存的逻辑CPU核心数(L1,L2,L3)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
下面是一些使用 GetLogicalProcessorInformation在Windows上检测L1,L2和L3 cpu缓存大小的C代码

typedef BOOL (WINAPI *LPFN_GLPI)(PSYstem_LOGICAL_PROCESSOR_INFORMATION,PDWORD);

LPFN_GLPI glpi = (LPFN_GLPI) GetProcAddress(
    GetModuleHandle(TEXT("kernel32")),"GetLogicalProcessorInformation");

if (glpi)
{
    DWORD bytes = 0;
    glpi(0,&bytes);
    size_t size = bytes / sizeof(SYstem_LOGICAL_PROCESSOR_INFORMATION);
    vector<SYstem_LOGICAL_PROCESSOR_INFORMATION> info(sizE);
    glpi(info.data(),&bytes);

    for (size_t i = 0; i < size; i++)
    {
        if (info[i].Relationship == RelationCachE)
        {
            if (info[i].Cache.Level == 1)
              l1_cache_Size = info[i].Cache.Size;
            if (info[i].Cache.Level == 2)
              l2_cache_Size = info[i].Cache.Size;
            if (info[i].Cache.Level == 3)
              l3_cache_Size = info[i].Cache.Size;
        }
    }
}

作为下一步,我希望获得共享缓存的逻辑cpu核心数量.在具有超线程的x64 cpu上,两个逻辑cpu内核通常共享L2缓存,并且所有逻辑cpu内核共享L3缓存.

通过MSDN阅读之后,我认为GetLogicalProcessorInformationEx和CACHE_RELATIONSHIPGROUP_AFFINITY我在寻找数据结构,但在尝试了这些数据结构之后,对我来说似乎毫无用处.

题:

有没有办法让使用C/C++在Windows上共享缓存的逻辑cpu核心数量? (理想情况下不直接使用cpuid)

解:

可以使用GetLogicalProcessorInformationEx和CACHE_RELATIONSHIPGROUP_AFFINITY数据结构获得共享高速缓存的逻辑cpu核心数. GROUP_AFFINITY.Mask值包含为共享当前缓存(RelationCachE)的每个cpu核心设置的@L_674_20@位.作为大多数具有超线程的Intel cpu的示例,GROUP_AFFINITY.Mask将包含为L2缓存设置的2位和为具有4个物理cpu核心和8个逻辑cpu核心的cpu设置的用于L3缓存的8位.

这是C代码

#include <windows.h>
#include <vector>
#include <iostream>

using namespace std;

typedef BOOL (WINAPI *LPFN_GLPI)(LOGICAL_PROCESSOR_RELATIONSHIP,PSYstem_LOGICAL_PROCESSOR_INFORMATION_EX,PDWORD);

int main()
{
    LPFN_GLPI glpi = (LPFN_GLPI) GetProcAddress(
        GetModuleHandle(TEXT("kernel32")),"GetLogicalProcessorInformationEx");

    if (!glpi)
        return 1;

    DWORD bytes = 0;
    glpi(RelationAll,&bytes);
    vector<char> buffer(bytes);
    SYstem_LOGICAL_PROCESSOR_INFORMATION_EX* info;

    if (!glpi(RelationAll,(SYstem_LOGICAL_PROCESSOR_INFORMATION_EX*) &buffer[0],&bytes))
        return 1;

    for (size_t i = 0; i < bytes; i += info->SizE)
    {
        info = (SYstem_LOGICAL_PROCESSOR_INFORMATION_EX*) &buffer[i];

        if (info->Relationship == RelationCache &&
            (info->Cache.Type == CacheData ||
             info->Cache.Type == CacheUnified))
        {
            cout << "info->Cache.Level: " << (int) info->Cache.Level << endl;
            cout << "info->Cache.CacheSize: " << (int) info->Cache.CacheSize << endl;
            cout << "info->Cache.GroupMask.Group: " << info->Cache.GroupMask.Group << endl;
            cout << "info->Cache.GroupMask.Mask: " << info->Cache.GroupMask.Mask << endl << endl;
        }
    }

    return 0;
}

注意事项:

我发现在虚拟机内运行Windows时,上面的代码无法正确检测共享缓存的cpu核心数量,例如:在具有2个虚拟cpu核心的VM上,上面的代码报告每个逻辑cpu核心具有专用的L1,L2和L3缓存.

解决方法

我已经在AppVeyor CI上测试了这个(甚至在发布到stackoverflow之前).这是x64 cpu输出

info->Cache.Level: 1
info->Cache.CacheSize: 32768
info->Cache.GroupMask.Group: 0
info->Cache.GroupMask.Mask: 1

info->Cache.Level: 1
info->Cache.CacheSize: 32768
info->Cache.GroupMask.Group: 0
info->Cache.GroupMask.Mask: 1

info->Cache.Level: 2
info->Cache.CacheSize: 262144
info->Cache.GroupMask.Group: 0
info->Cache.GroupMask.Mask: 1

info->Cache.Level: 3
info->Cache.CacheSize: 31457280
info->Cache.GroupMask.Group: 0
info->Cache.GroupMask.Mask: 1

info->Cache.Level: 1
info->Cache.CacheSize: 32768
info->Cache.GroupMask.Group: 0
info->Cache.GroupMask.Mask: 2

info->Cache.Level: 1
info->Cache.CacheSize: 32768
info->Cache.GroupMask.Group: 0
info->Cache.GroupMask.Mask: 2

info->Cache.Level: 2
info->Cache.CacheSize: 262144
info->Cache.GroupMask.Group: 0
info->Cache.GroupMask.Mask: 2

info->Cache.Level: 3
info->Cache.CacheSize: 31457280
info->Cache.GroupMask.Group: 0
info->Cache.GroupMask.Mask: 2

根据MSDN文档:“GroupMask.Mask – 指定指定组内零个或多个处理器的亲和性的位图.”基于此文档,我期待L3缓存的不同GroupMask.Mask,但上面的输出不显示这一点.对我来说,GroupMask.Mask中的数据毫无意义!

这是@L_674_20@产生上述数据的link to the code

@H_618_45@

大佬总结

以上是大佬教程为你收集整理的c – 获取共享缓存的逻辑CPU核心数(L1,L2,L3)全部内容,希望文章能够帮你解决c – 获取共享缓存的逻辑CPU核心数(L1,L2,L3)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。