首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows Server / Datacenter:将CPU关联设置为64核以上

Windows Server / Datacenter:将CPU关联设置为64核以上
EN

Stack Overflow用户
提问于 2012-11-15 04:35:00
回答 3查看 2K关注 0票数 4

SetThreadAffinityMask()允许用户为64个逻辑核心(处理器)设置关联掩码。但是,Windows Datacenter最多可以有64个CPU,每个CPU都有多个核心(请参见here)。

如何设置大于64核的线程?

Ps。我是用C#编写的,所以.Net答案是理想的,但是用C语言也可以。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-07 21:45:45

我使用以下代码来设置处理器组和CPU的亲和性:

代码语言:javascript
复制
[StructLayout(LayoutKind.Sequential, Pack = 4)]
private struct _GROUP_AFFINITY
{
    public UIntPtr Mask;
    [MarshalAs(UnmanagedType.U2)]
    public ushort Group;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.U2)]
    public ushort[] Reserved;
}

[DllImport("kernel32", SetLastError = true)]
private static extern Boolean SetThreadGroupAffinity(
    IntPtr hThread,
    ref _GROUP_AFFINITY GroupAffinity,
    ref _GROUP_AFFINITY PreviousGroupAffinity);

[DllImport("kernel32", SetLastError = true)]
private static extern IntPtr GetCurrentThread();

/// <summary>
/// Sets the processor group and the processor cpu affinity of the current thread.
/// </summary>
/// <param name="group">A processor group number.</param>
/// <param name="cpus">A list of CPU numbers. The values should be
/// between 0 and <see cref="Environment.ProcessorCount"/>.</param>
public static void SetThreadProcessorAffinity(ushort groupId, params int[] cpus)
{
    if (cpus == null) throw new ArgumentNullException(nameof(cpus));
    if (cpus.Length == 0) throw new ArgumentException("You must specify at least one CPU.", nameof(cpus));

    // Supports up to 64 processors
    long cpuMask = 0;
    foreach (var cpu in cpus)
    {
        if (cpu < 0 || cpu >= Environment.ProcessorCount)
            throw new ArgumentException("Invalid CPU number.");

        cpuMask |= 1L << cpu;
    }

    var hThread = GetCurrentThread();
    var previousAffinity = new _GROUP_AFFINITY {Reserved = new ushort[3]};
    var newAffinity = new _GROUP_AFFINITY
    {
        Group = groupId,
        Mask = new UIntPtr((ulong) cpuMask),
        Reserved = new ushort[3]
    };

    SetThreadGroupAffinity(hThread, ref newAffinity, ref previousAffinity);
}
票数 2
EN

Stack Overflow用户

发布于 2012-11-15 05:00:58

根据MSDN的说法,SetThreadAffinityMask()设置当前处理器组的亲和性,每个处理器组可以有64个逻辑核心。使用SetThreadGroupAffinity()更改您的组。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/dd405503(v=vs.85).aspx

票数 2
EN

Stack Overflow用户

发布于 2012-11-15 08:03:51

为了使用64个以上的CPU,必须将处理器组考虑在内。详情请参考MSDN:

Processor Groups

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13386855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档