我有两个版本的fast newline-counting routine。一个运行在较旧的硬件上,另一个运行使用POPCNT指令,该指令在新硬件(例如第六代Intel CPU)上可用,运行速度更快。如何检测CPU是否具有良好的POPCNT支持?
现在我想为每个CPU使用最好的版本—我如何知道它是否具有高性能的POPCNT实现?
我有两个版本的fast newline-counting routine。一个运行在较旧的硬件上,另一个运行使用POPCNT指令,该指令在新硬件(例如第六代Intel CPU)上可用,运行速度更快。如何检测CPU是否具有良好的POPCNT支持?
现在我想为每个CPU使用最好的版本—我如何知道它是否具有高性能的POPCNT实现?
你可以做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的可用性。
不应该['count_ones'](https://doc.rust-lang.org/std/primitive.usize.html#method.count_ones)自动执行该操作吗? – starblue
@starblue它可以不同。使用'count_ones'将允许LLVM针对**目标**机器进行优化,因此您可以删除任何运行时决策。如果编译的代码需要能够在运行时进行切换,则可能仍然需要查询当前的处理器。 – Shepmaster