2016-09-23 37 views
6

Tôi có hai phiên bản fast newline-counting routine. Một cái chạy trên phần cứng cũ hơn, trong khi cái còn lại chạy nhanh hơn nhiều bằng cách sử dụng lệnh POPCNT, có sẵn trên phần cứng mới hơn (ví dụ: CPU Intel thế hệ thứ 6).Làm cách nào để phát hiện liệu CPU có hỗ trợ POPCNT tốt?

Bây giờ tôi muốn sử dụng phiên bản tốt nhất cho mỗi CPU — làm thế nào tôi có thể tìm hiểu xem nó có triển khai POPCNT hiệu suất cao không?

+2

Không nên ['count_ones'] (https://doc.rust-lang.org/std/primitive.usize.html#method.count_ones) tự động làm điều đó? – starblue

+1

@ starblue nó có thể khác nhau. Sử dụng 'count_ones' sẽ cho phép LLVM tối ưu hóa cho máy ** target **, vì vậy bạn có thể loại bỏ bất kỳ quyết định thời gian chạy nào. Nếu mã được biên dịch cần có khả năng chuyển đổi trong thời gian chạy mặc dù, bạn vẫn có thể cần truy vấn bộ xử lý hiện tại. – Shepmaster

Trả lời

8

Bạn có thể làm like @kobrien said, hoặc bạn có thể tham gia một cách tiếp cận văn minh hơn - các cpuid crate.

Để làm điều đó, thêm nó vào Cargo.toml bạn và sau đó, để kiểm tra tính sẵn sàng của POPCNT làm

extern crate cpuid; 

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

Chức năng have_popcnt() sẽ trở lại None nếu CPU không hỗ trợ hướng dẫn CPUID hoặc Some(hp), trong đó hp xác định tính khả dụng của POPCNT.

Các vấn đề liên quan