Итак, оказывается, что в PowerShell нет встроенного способа переключения «Группы процессоров», когда у вас более 64 логических процессоров.
Хорошо, но даже без групп процессоров я столкнулся с проблемой, когда хотел установить привязку процесса к 63-му процессору (т. е. 64-му логическому процессору) с помощью .ProcessorAffinity, , который является последним логическим процессором, который может вписаться в «нормальный» системе без необходимости использования групп процессоров .
Возможно, я что-то упускаю, но это дает мне целочисленное переполнение, соответственно. он не может преобразовать значения в IntPtr.
Значение сходства для ЦП 63 будет 2^63, что составляет 9223372036854775808. Однако максимальное значение для 64-битного целого числа со знаком [Int64] составляет 9223372036854775807, то есть на 1 меньше.
И я не могу передать [UInt64] или [BigInt] в .ProcessorAffinity, так как не получится преобразовать в IntPtr (даже при использовании небольших чисел).
В качестве примера:
> (Get-Process 'notepad').ProcessorAffinity = [UInt64] [Math]::Pow(2, 63)
Exception setting "ProcessorAffinity": "Cannot convert the "9223372036854775808" value of type "System.UInt64" to type
"System.IntPtr"."
At line:1 char:1
+ (Get-Process 'notepad').ProcessorAffinity = [UInt64] [Math]::Pow(2, 6 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], SetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenSetting
И даже выполнение (Get-Process 'notepad').ProcessorAffinity = [UInt64] 3 не работает с той же ошибкой.
Удаление приведения типа к [UInt64] также не работает (аналогичное сообщение об ошибке, только на этот раз с [Double]), а приведение к [Int64] вместо этого вызывает «Арифметическая операция привела к переполнению». ошибка. Конечно, поскольку оно больше максимального значения.
Итак, есть ли способ вообще установить привязку процессора к собственному свойству PowerShell .ProcessorAffinity к ЦП 63 (или комбинации ЦП 63 с любым другим ЦП, что наверняка превысит предел 64-битного целого числа)?





Следует помнить, что привязка процессора — это битовая маска, а не число (см. Привязка процессора).
Действительно, максимальное значение: 9223372036854775807
PS C:\> [System.IntPtr]::MaxValue
9223372036854775807
Что получается с небольшим значением:
PS C:\> [System.Convert]::ToString('9223372036854775807',2)
111111111111111111111111111111111111111111111111111111111111111
Правильно было указано (подмигнуло), что это всего лишь 63 бита. Но нам нужен 64-битный набор. например.:
1000000000000000000000000000000000000000000000000000000000000000
или
9223372036854775807 + 1 = 9223372036854775808
Да, мы можем сохранить это значение в Unsigned Int, но десятичное «число» больше, чем MaxValue 9223372036854775807, и поэтому, да, как вы узнали, Unsigned Int не будет работать.
Но помните, что целые числа работают так: 64-й бит — это значение знака, поэтому мы думали об этом неправильно. Нам нужно не 9223372036854775807 + 1, а на самом деле, как ни странно, нам нужно отрицательное значение:
PS C:\> [System.Convert]::ToInt64('1000000000000000000000000000000000000000000000000000000000000000',2)
-9223372036854775808
И мы можем убедиться, что это отрицательное число является допустимым значением, поскольку минимальное значение IntPtr не равно 0, а -9223372036854775808:
PS C:\> [System.IntPtr]::MinValue
-9223372036854775808
И мы можем установить это отрицательное значение:
(Get-Process 'notepad').ProcessorAffinity = -9223372036854775808
Действительно, оказывается, что отрицательное значение — это правильный способ установить близость с помощью
ProcessorAffinity. Кроме того, значение для ЦП 62+63 равно -4611686018427387904. А если вы используете неродную функциюSetThreadGroupAffinity, вы действительно можете использовать беззнаковые 64-битные целые числа, поэтому нет необходимости передавать отрицательное значение. Однако когда вы используете это, диспетчер задач не будет отображать привязку к основному процессу.