2016-01-21 2 views
-1

У меня есть компьютер с более чем 31 процессорным ядром. Я хотел бы назначить процесс ядрам процессора за пределами 31-го. Моя проблема в том, что IntPtr разрешает 32-битное целое на этом компьютере. Это 64-разрядная машина с 64-разрядной операционной системой. Это, кажется, бросает вызов тому, что заявлено Microsoft hereC# IntPtr и ProcessorAffinity - как превзойти 32 бита?

Тип IntPtr предназначен быть целым числом, размер которого платформы. То есть ожидается, что экземпляр этого типа будет 32-разрядных 32-разрядных аппаратных и операционных систем и 64-разрядных бит на 64-разрядных аппаратных и операционных системах.

Вот как я построении IntPtr:

public static IntPtr GetCpuBinaryValue(int cpuIndex) 
{ 
    // The IntPtr type is designed to be an integer whose size is platform - specific. 
    // That is, an instance of this type is expected to be 32 - bits on 32 - bit hardware and operating systems, 
    // and 64 - bits on 64 - bit hardware and operating systems. 


    IntPtr ptr = new IntPtr(Convert.ToInt64(Math.Pow(2, cpuIndex))); 
    return ptr; 
} 

И продолжить пример, вот как я установил ProcessorAffinity:

using System.Diagnostics; 
... 
    // set which processor to run the process on 
       process.ProcessorAffinity = GetCpuBinaryValue(coreIndex); 
... 

Например, я могу передать в значение «0», и оно вернет IntPtr (32-бит) с маской 00000000 00000000 00000000 00000001

Если я перейду в «31», это будет r eturn 10000000 00000000 00000000 00000000

Что я хочу это для того, чтобы бросить, как 64 бит, например, если я прохожу в значение "32", он будет возвращать: 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

Есть способ обойти эту проблему? Он упрямо застрял на 32-битной.

+0

Какую проблему вы пытаетесь решить, выполнив это? –

+0

Это ограничение в базовой функции winapi, SetProcessAffinityMask(). В 32-битном режиме он может обрабатывать только 32 процессора. Вы ничего не можете с этим поделать, если вы не можете столкнуться с AnyCPU, ваше оборудование значительно мощнее вашего программного обеспечения. –

ответ

1

Возможно, вы работаете в x86 или Any CPU. IntPtr зависит от платформы, но также зависит от самого процесса. Если процесс работает в 64-битном режиме, то указатели будут 64-битными, а если процесс выполняется в 32-битном, то указатели будут 32-битными.

Если вы переключаетесь на явный запуск как x64 (как описано в How to: Configure Projects to Target Platforms), исключение переполнения исчезает, и правильное значение, похоже, сохраняется в возвращаемом значении.

+0

Замечание для всех, кто остался в этом: все проекты и исполняемые файлы должны быть 64-битными, чтобы это работало. В моем случае - когда я установил 64-битное основное приложение для запуска консоли, он использовал вторую консоль, скомпилированную в 32-разрядной версии. – sapbucket

Смежные вопросы