Сколько процессорных ядер поддерживает планировщик .NET-задач?

Просто из любопытства я хотел бы знать, сколько процессорных ядер поддерживает планировщик задач .NET.

Windows Server 2012 поддерживает до 640 ядер. Был (есть).NET ограничен 64 или он будет использовать все доступные ядра?

Ответ 1

.NET поддерживает все ядра. Ответ от Stehphen Toub на форуме MSDN Parallel Extensions:

TPL TaskScheduler по умолчанию имеет значение .NET ThreadPool. По умолчанию пул ограничивается одной группой процессором и, следовательно, до 64 ядер. Однако в .NET 4.5 вы можете установить флаг <Thread_UseAllCpuGroups enabled="true"/>. Когда ваш компьютер имеет несколько групп процессоров, включение этого элемента приводит к тому, что среда выполнения распределяет управляемые потоки во всех группах ЦП, а не ограничивается одним, и, таким образом, планировщик по умолчанию может ориентироваться на все, что поддерживает ОС. (GCCpuGroup также должен быть включен, чтобы этот параметр вступил в силу.)

Ответ 2

В соответствии с CLR через С#, 3-е изд., глава 25 Основные понятия:

Сегодня CLR [...] может использовать до 64 ядер при работе в 64-битной Windows. [... M] для работы в 32-разрядной версии Windows могут использоваться до 32 ядер.

Книга была написана в 2010 году, поэтому она содержит информацию, относящуюся к .Net 4.0 и Windows Server 2008 R2, но Я не думаю, что .Net 4.5 изменил что-либо в этом отношении. РЕДАКТИРОВАТЬ: Кажется .Net 4.5 действительно изменил это, см. ответ Peter Meinl, цитируя Стивена Туба.

Ответ 3

Эрик Липперт (источник)

Для бета-версии 1 CLR 4.0 планировщиком по умолчанию для TPL будет CLR пул потоков

Это примерно означает, что работа входит в очередь FIFO, и каждое ядро ​​удаляет объект рабочей нагрузки. Другими словами, теперь нет фиксированной верхней границы для количества ядер, поддерживаемых CLR threadpool. Эта верхняя граница применяется другими сторонами - ОС, аппаратной и процессорной платформой.

По умолчанию количество потоков в пуле (за этот ответ)

  • 1023 в Framework 4.0 (32-разрядная среда)
  • 32768 в Framework 4.0 (64-разрядная среда)
  • 250 на ядро ​​в Framework 3.5
  • 25 на ядро ​​в Framework 2.0

Что технически позволяет много параллельных исполнений на выделенных ядрах.

Примечание это не значит, что в любой момент времени в пуле есть много потоков. CLR и ОС обычно пытаются медленно уменьшить количество потоков в пуле, чтобы освободить ресурсы, которые не используются.