Я хочу определить количество реальных физических ядер, а не логических ядер, для рабочих нагрузок, которые масштабируются отрицательно, когда большее количество потоков конкурирует за частные кэши для каждого ядра, и / или имеют достаточно высокий 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) и измерьте общее время. Сравните два раза, чтобы угадать количество физических ядер. Это может сработать, но выглядит дорого и ненадежно для меня.