2012-11-14 33 views
2

SetThreadAffinityMask()允許爲64個邏輯內核(處理器)設置關聯掩碼。但是,Windows Datacenter最多可以有64個CPU,每個CPU具有多個內核(請參閱here)。Windows服務器/數據中心:使用> 64個內核設置CPU關聯

如何爲64個內核設置線程?

Ps。我使用C#編寫代碼,因此.Net答案是理想的,但C語言中的API也很好。

回答

1

我使用下面的代碼來設置處理器組和CPU的親和力:

[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); 
} 
+0

調用SetThreadProcessorAffinity幾個時間你想要的進程來運行每個組在? – bananasplit

+1

@bananasplit好問題!一個進程可以具有多組關聯。但是任何時候都不能將線程分配給多個組。上面的代碼是基於線程的。 AFAIK如果您將一個線程重新分配給初始組以外的其他組,則該過程將變爲多組。 –

0

要使用64個以上的CPU,必須考慮處理器組。請參考MSDN的細節:

Processor Groups

相關問題