使用C#设置CPU的亲和性

Kan*_*lit 5 .net c# cpu affinity

我在C#中创建了一个窗口应用程序.现在我想为这个应用程序设置CPU亲和力.我可能有2个处理器,4个处理器,8个处理器或者可能超过8个处理器.

我想使用接口的输入设置cpu亲和性.

我怎样才能实现这一目标?如何使用Environment.ProcessorCount设置关联?

Ale*_*ici 12

试试这个:

Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)2;
Run Code Online (Sandbox Code Playgroud)

这里有更多关于它的信息.

ProcessorAffinity将每个处理器表示为一个位.位0表示处理器1,位1表示处理器2,依此类推.下表显示了四处理器系统的可能ProcessorAffinity的子集.

Property value (in hexadecimal)  Valid processors

0x0001                           1
0x0002                           2
0x0003                           1 or 2
0x0004                           3
0x0005                           1 or 3
0x0007                           1, 2, or 3
0x000F                           1, 2, 3, or 4
Run Code Online (Sandbox Code Playgroud)

这是一个小样本程序:

//TODO: manage exceptions
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Total # of processors: {0}", Environment.ProcessorCount);
        Console.WriteLine("Current processor affinity: {0}", Process.GetCurrentProcess().ProcessorAffinity);
        Console.WriteLine("*********************************");
        Console.WriteLine("Insert your selected processors, separated by comma (first CPU index is 1):");
        var input = Console.ReadLine();
        Console.WriteLine("*********************************");
        var usedProcessors = input.Split(',');

        //TODO: validate input
        int newAffinity = 0;
        foreach (var item in usedProcessors)
        {
            newAffinity = newAffinity | int.Parse(item);
            Console.WriteLine("Processor #{0} was selected for affinity.", item);
        }
        Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)newAffinity;
        Console.WriteLine("*********************************");
        Console.WriteLine("Current processor affinity is {0}", Process.GetCurrentProcess().ProcessorAffinity);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

Alex Filipovivi 提供的示例程序似乎不正确,因为它将处理器编号 OR 到 newAffinity 中,而没有先将它们转换为设置位。因此,如果您向该程序输入 3,4,您将获得 7 的亲和掩码,即核心 1、2 和 3!掩码应设置为 12(十六进制 0xC,二进制 1100,如果第 0 位是最低有效位,则设置第 2 位和第 3 位)。

更换

newAffinity = NewAffinity | int.Parse(item);
Run Code Online (Sandbox Code Playgroud)

newAffinity = newAffinity | (1 << int.Parse(item)-1);
Run Code Online (Sandbox Code Playgroud)

是一种合理的方式来做到这一点。