Как определить, имеет ли CPU хорошую поддержку POPCNT?

У меня есть две версии fast newline-подсчет рутины. Один работает на старом оборудовании, в то время как другой работает намного быстрее, используя инструкцию POPCNT, которая доступна на более новом оборудовании (например, процессоры Intel 6-го поколения).

теперь я хотел бы использовать лучшую версию для каждого процессора - как я могу узнать, имеет ли он высокопроизводительную реализацию POPCNT?

2 ответов


вы могли бы сделать как сказал @kobrien, или вы могли бы принять более цивилизованный подход -cpuid ящик.

чтобы сделать это, добавьте это в ваш Cargo.toml а затем, чтобы проверить наличие POPCNT do

extern crate cpuid;

fn have_popcnt() -> Option<bool> {
    cpuid::identify().ok().map(|ci| ci.has_feature(cpuid::CpuFeature::POPCNT))
}

на вернутся None если CPU не поддерживает инструкцию CPUID или Some(hp), где hp определяет доступность POPCNT на нем.


выполните инструкцию cpuid. Проверьте бит 23 ecx.

https://en.wikipedia.org/wiki/CPUID