В Vista и выше вы можете использовать GetLogicalProcessorInformation через PInvoke, чтобы получить количество логических процессоров.
В Windows XP через C # нет способа надежно отличить гиперпоточность от других многопроцессорных / базовых конфигураций. Решение WMI, которое кто-то опубликовал, будет классифицировать многоядерные процессоры как гиперпоточные.
До Vista единственным надежным средством является проверка CPUID процессора. Чтобы использовать это, вы можете создать собственную DLL, которая будет вызываться из вашего управляемого кода. Следующий код Intel sample будет хорошей отправной точкой.