2016-09-23 16 views
6

Mam dwie wersje fast newline-counting routine. Jeden działa na starszym sprzęcie, a drugi działa znacznie szybciej za pomocą instrukcji POPCNT, która jest dostępna na nowszym sprzęcie (np. Procesory Intel 6. generacji).Jak wykryć, czy procesor ma dobrą obsługę POPCNT?

Teraz chciałbym użyć najlepszej wersji dla każdego procesora — jak mogę się dowiedzieć, czy ma on wysoką wydajność POPCNT?

+2

Nie powinien ["count_ones'] (https://doc.rust-lang.org/std/primitive.usize.html#method.count_ones) zrobić to automatycznie? – starblue

+1

@starblue może być inny. Użycie opcji 'count_ones' pozwoli na optymalizację LLVM dla ** docelowego ** komputera, aby można było usunąć wszelkie decyzje dotyczące środowiska wykonawczego. Jeśli skompilowany kod musi być w stanie przełączać się w czasie wykonywania, nadal może być konieczne zapytanie do bieżącego procesora. – Shepmaster

Odpowiedz

8

Można zrobić like @kobrien said, czy można przyjąć bardziej cywilizowane podejście - z cpuid crate.

Aby to zrobić, dodaj go do swojej Cargo.toml a następnie, w celu sprawdzenia dostępności POPCNT zrobić

extern crate cpuid; 

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

Funkcja have_popcnt() powróci None jeśli procesor nie obsługuje instrukcji CPUID lub Some(hp), gdzie hp określa dostępność POPCNT na tym.

Powiązane problemy