2016-09-23 51 views
6

fast newline-counting routine'un iki sürümü var. Biri eski donanım üzerinde çalışır, diğeri ise daha yeni donanımlarda (örn. 6. nesil Intel CPU'lar) bulunan POPCNT komutunu kullanarak çok daha hızlı çalışır.CPU'nun iyi POPCNT desteğine sahip olup olmadığını nasıl anlarım?

Şimdi her CPU için en iyi sürümü kullanmak istiyorum — Yüksek performanslı bir POPCNT uygulamasının olup olmadığını nasıl öğrenebilirim?

+2

['count_ones'] (https://doc.rust-lang.org/std/primitive.usize.html#method.count_ones) bunu otomatik olarak yapmamalıdır mı? – starblue

+1

@starblue farklı olabilir. 'Count_ones' kullanarak LLVM'nin ** hedef ** makinesi için optimize etmesine izin verir, böylece tüm çalışma zamanı kararlarını kaldırabilirsiniz. Derlenmiş kodun çalışma zamanında geçiş yapabilmesi gerekiyorsa, hala geçerli işlemciyi sorgulamanız gerekebilir. – Shepmaster

cevap

8

Sen like @kobrien said yapabileceğini ya da daha medeni bir yaklaşım olabilir - cpuid crate.

bunu yapar, senin Cargo.toml eklemek ve daha sonra, POPCNT kullanılabilir olup olmadığını kontrol etmek için

CPU CPUID talimat veya Some(hp) desteklemiyorsa have_popcnt() işlevi None dönecektir
extern crate cpuid; 

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

, Burada hp, POPCNT'nin kullanılabilirliğini belirler.