Чтобы установить сродство процессоров с помощью C#

Я создал оконное приложение в C#. Теперь я хочу установить привязку ЦП для этого приложения. У меня может быть 2 процессора,4 процессора,8 процессоров или может быть более 8 процессоров.

Я хочу установить сродство процессора с помощью ввода из интерфейса.

Как я могу достичь этого? Как можно установить сходство, используя Environment.ProcessorCount?

4 ответа

Решение

Попробуй это:

Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)2;

Вот еще об этом.

ProcessorAffinity представляет каждый процессор как бит. Бит 0 представляет процессор один, бит 1 представляет процессор два и так далее. В следующей таблице показано подмножество возможных 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

Вот небольшой пример программы:

//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);
    }
}

Представленный пример программы Алекса Филиповиви кажется неверным в том смысле, что он использует ИЛИ номера процессоров в newAffinity без предварительного преобразования их в установленный бит. Поэтому, если вы введете 3,4 для этой программы, вы получите маску сродства 7, то есть ядра 1, 2 и 3! Маска должна быть установлена ​​на 12 (шестнадцатеричный 0xC, двоичный 1100, в котором установлены биты 2 и 3, если бит 0 является младшим значащим битом).

Замена

newAffinity = NewAffinity | int.Parse(item);

с

newAffinity = newAffinity | (1 << int.Parse(item)-1);

Один разумный способ сделать это.

Для людей, ищущих нить сродства.

public class CpuAffinity
{
    [DllImport("kernel32.dll")]
    static extern IntPtr GetCurrentThread();

    [DllImport("kernel32.dll")]
    static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);

    /// <summary>
    /// Sets the current Thread to have affinity to the specified cpu/processor if the system has more than one.
    /// 
    /// Supports most systems as we use a signed int; Anything more than 31 CPU's will not be supported.
    /// </summary>
    /// <param name="cpu">The index of CPU to set.</param>
    public static void SetCurrentThreadToHaveCpuAffinityFor(int cpu)
    {
        if (cpu < 0)
        {
            throw new ArgumentOutOfRangeException("cpu");
        }

        if (Environment.ProcessorCount > 1)
        {
            var ptr = GetCurrentThread();
            SetThreadAffinityMask(ptr, new IntPtr(1 << cpu));

            Debug.WriteLine("Current Thread Of OS Id '{0}' Affinity Set for CPU #{1}.", ptr, cpu);
        }else
        {
            Debug.WriteLine("The System only has one Processor.  It is impossible to set CPU affinity for other CPU's that do not exist.");
        }
    }
}

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.processoraffinity.aspx

Что вы хотите использовать Environment.ProcessorCount за? Проверка ввода пользователя? В любом случае, если вы хотите выбрать конкретный процессор (#1 или #2 или #3...), создайте такую ​​битовую маску:

if (userSelection <= 0 || userSelection > Environment.ProcessorCount)
{
    throw new ArgumentOutOfRangeException();
}

int bitMask = 1 << (userSelection - 1);
Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)bitMask;

Где userSelection - номер выбранного процессора.

Если вы хотите выбрать более одного процессора, то выполните

bitMask |= 1 << (anotherUserSelection - 1);

для каждого выбора пользователя

Другие вопросы по тегам