SetThreadAffinityMask()允許爲64個邏輯內核(處理器)設置關聯掩碼。但是,Windows Datacenter最多可以有64個CPU,每個CPU具有多個內核(請參閱here)。Windows服務器/數據中心:使用> 64個內核設置CPU關聯
如何爲64個內核設置線程?
Ps。我使用C#編寫代碼,因此.Net答案是理想的,但C語言中的API也很好。
SetThreadAffinityMask()允許爲64個邏輯內核(處理器)設置關聯掩碼。但是,Windows Datacenter最多可以有64個CPU,每個CPU具有多個內核(請參閱here)。Windows服務器/數據中心:使用> 64個內核設置CPU關聯
如何爲64個內核設置線程?
Ps。我使用C#編寫代碼,因此.Net答案是理想的,但C語言中的API也很好。
我使用下面的代碼來設置處理器組和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);
}
根據MSDN的說法,SetThreadAffinityMask()爲您當前的處理器組設置親和性,每個處理器組可以有64個邏輯核心。使用SetThreadGroupAffinity()更改您的組。有關更多信息,請參見http://msdn.microsoft.com/en-us/library/windows/desktop/dd405503(v=vs.85).aspx。
要使用64個以上的CPU,必須考慮處理器組。請參考MSDN的細節:
調用SetThreadProcessorAffinity幾個時間你想要的進程來運行每個組在? – bananasplit
@bananasplit好問題!一個進程可以具有多組關聯。但是任何時候都不能將線程分配給多個組。上面的代碼是基於線程的。 AFAIK如果您將一個線程重新分配給初始組以外的其他組,則該過程將變爲多組。 –