Как найти количество физических ядер ЦП (не логических гиперпотоков SMT) через. NET Core? - PullRequest
3 голосов
/ 19 марта 2020

Я хочу определить количество реальных физических ядер, а не логических ядер, для рабочих нагрузок, которые масштабируются отрицательно, когда большее количество потоков конкурирует за частные кэши для каждого ядра, и / или имеют достаточно высокий IP C, на котором выполняется более одного логического количество потоков на ядро ​​не увеличивает пропускную способность более, чем увеличивает нагрузку на потоки, особенно для задач, которые не масштабируются идеально до большого количества ядер.

Или, другими словами, количество потоков, которые могут работать без каких-либо из них, конкурирующих за ресурсы выполнения друг с другом, кроме пропускной способности памяти. (Примечание редактора: некоторые альтернативы гиперпоточности, такие как AMD Семейство Bulldozer CMP , имеют 2 целочисленных ядра, совместно использующих блок FPU / SIMD; возможно, вы захотите считать это как 2 реальных ядра в зависимости от рабочей нагрузки, даже если вы не хочу считать 2 логических ядра, совместно использующих физическое ядро ​​с SMT , например, Intel Hyperthreading.)


Я знаю, что подобные вопросы задавались ранее, но ответы выглядят устаревшими. Или Получение подсчета физических процессоров. NET Core 2.2 остается без ответа, а указанный код не является полностью переносимым.

System.Environment.ProcessorCount возвращает количество только логических ядер, поэтому двойная сумма в моей системе гиперпоточности. Для некоторых интенсивных параллельных вычислений наиболее эффективно запускать не больше потоков, чем доступно физических ядер - по крайней мере, мои тесты показали значительную потерю производительности, когда я запустил больше потоков.

Я нашел некоторые windows только решения, вызывающие WMI или kernel.dll для получения количества физических ядер. Но как это сделать в. net ядре, чтобы сохранить независимость от платформы ? Есть ли где-то скрытое число ядер или надежный способ его подсчета?

Самая многообещающая идея, которую я нашел до сих пор, - это выполнить более длительный расчет в одном потоке и измерить время для него. Затем выполните те же вычисления параллельно (т.е. потоки ProcessorCount) и измерьте общее время. Сравните два раза, чтобы угадать количество физических ядер. Это может сработать, но выглядит дорого и ненадежно для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...