fast newline-counting routineの2つのバージョンがあります。 1つは古いハードウェア上で実行され、もう1つはより新しいハードウェア(例えば第6世代のIntel CPU)で利用可能なPOPCNT命令を使用することにより、より高速に実行される。CPUがPOPCNTをサポートしているかどうかをどのように検出するのですか?
各CPUに最適なバージョンを使用したい—高性能のPOPCNT実装があるかどうか調べるにはどうすればよいですか?
fast newline-counting routineの2つのバージョンがあります。 1つは古いハードウェア上で実行され、もう1つはより新しいハードウェア(例えば第6世代のIntel CPU)で利用可能なPOPCNT命令を使用することにより、より高速に実行される。CPUがPOPCNTをサポートしているかどうかをどのように検出するのですか?
各CPUに最適なバージョンを使用したい—高性能のPOPCNT実装があるかどうか調べるにはどうすればよいですか?
あなたは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の利用可能性を決定します。
cpuid命令を実行します。 ecxのビット23をチェックしてください。
私の[cupid](https://crates.io/crates/cupid)のような、このための箱があります。 – Shepmaster
[count_ones'](https://doc.rust-lang.org/std/primitive.usize.html#method.count_ones)で自動的に行うべきではありませんか? – starblue
@starblueそれは違うかもしれません。 'count_ones'を使うと、LLVMは**ターゲットマシン**を最適化することができるので、実行時の決定を削除することができます。実行時にコンパイルされたコードを切り替える必要がある場合は、依然として現在のプロセッサに問い合わせる必要があります。 – Shepmaster