2016-09-23 241 views
6

我有两个版本的fast newline-counting routine。一个运行在较旧的硬件上,另一个运行使用POPCNT指令,该指令在新硬件(例如第六代Intel CPU)上可用,运行速度更快。如何检测CPU是否具有良好的POPCNT支持?

现在我想为每个CPU使用最好的版本—我如何知道它是否具有高性能的POPCNT实现?

+2

不应该['co​​unt_ones'](https://doc.rust-lang.org/std/primitive.usize.html#method.count_ones)自动执行该操作吗? – starblue

+1

@starblue它可以不同。使用'count_ones'将允许LLVM针对**目标**机器进行优化,因此您可以删除任何运行时决策。如果编译的代码需要能够在运行时进行切换,则可能仍然需要查询当前的处理器。 – Shepmaster

回答

8

你可以做like @kobrien said,或者你可以采取更文明的方法 - 在cpuid crate

要做到这一点,把它添加到您的Cargo.toml然后,以检查POPCNT的可用性做

extern crate cpuid; 

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

have_popcnt()函数将返回None如果CPU不支持CPUID指令或Some(hp),其中hp确定POPCNT的可用性。