2016-09-23 217 views
6

fast newline-counting routineの2つのバージョンがあります。 1つは古いハードウェア上で実行され、もう1つはより新しいハードウェア(例えば第6世代のIntel CPU)で利用可能なPOPCNT命令を使用することにより、より高速に実行される。CPUがPOPCNTをサポートしているかどうかをどのように検出するのですか?

各CPUに最適なバージョンを使用したい—高性能のPOPCNT実装があるかどうか調べるにはどうすればよいですか?

+2

[count_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を。 POPCNTの可用性をチェックするために、あなたのCargo.tomlし、その後にそれを追加し、それを行うために

extern crate cpuid; 

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

を行うCPUがCPUID命令やSome(hp)をサポートしていない場合have_popcnt()機能は、Noneを返します。 hpはPOPCNTの利用可能性を決定します。

関連する問題