Tôi muốn biết nếu cpus hiện tại tránh nhân hai số khi ít nhất một trong số đó là số không. Cảm ơnLàm cpus bỏ qua nhân hiện đại bằng không?
Trả lời
Tôi hy vọng rằng một CPU máy tính để bàn hiện đại sẽ có một thứ như vậy trong đó.
CPU hiện đại - ý bạn là gì? Bạn có ý nghĩa phổ biến nhất được sử dụng (như x86, AMD64, ARM) hoặc gần đây nhất được phát triển. Mỗi kiến trúc bộ xử lý đều có thuộc tính riêng của nó. Hơn nữa, mỗi công ty (như Intel hay AMD) có thể làm cho bộ vi xử lý theo cách khác nhau (thường là bí mật của công ty).
Khi bạn đặt câu hỏi, tôi nghi ngờ điều đó. Bạn biết đấy, ngay cả khi kiểm tra xem con số có bằng không bằng không hai lần trước khi MỌI phép nhân là quá nhiều chi phí, nếu bạn tính tỷ lệ phần trăm của các hoạt động nhân lên thực sự được tối ưu hóa như thế nào.
Tối ưu hóa như vậy sẽ làm cho CPU đắt hơn.
Giả sử có 1% số phép nhân bằng 0 (và có thể thấp hơn nhiều) trong chương trình trung bình. Điều đó có nghĩa là so sánh với số không sẽ nhanh hơn 200 lần so với nhân với chỉ chiếm trên (và nhiều hơn nữa cho điều này là hữu ích trong thực tế).
Tôi nghĩ bạn đang xem xét câu hỏi này quá nhiều từ quan điểm của con người. Khi bạn nhân lên, bạn thấy rõ rằng một trong các phép nhân là số không và kết thúc. Tuy nhiên, mọi thứ rất khác với máy tính. Máy tính thực sự phải kiểm tra tất cả 64 hoặc 32 bit để chắc chắn rằng một cái gì đó bằng không.
- Tôi sẽ không lo lắng nếu tôi là bạn. Các nhà sản xuất bộ xử lý và nhà biên dịch đang cố gắng hết sức để tối đa hóa hiệu suất. Họ có suy nghĩ văn học về mọi thứ.
Tôi đồng ý, phép nhân nhanh. Có vẻ như một quá tối ưu hóa để kiểm tra từng giá trị trước khi bàn tay. Tôi sẽ đặt cược CPU chỉ hoạt động. –
Chắc chắn. :) Tôi nghĩ câu trả lời của tôi bao gồm nó. Đặc biệt là đoạn cuối. –
Bạn đang quên mất bao nhiêu nó có thể nhanh hơn khi thực hiện trong phần cứng. – Puppy
Điều này thay đổi tùy thuộc vào CPU và (trong một số trường hợp) loại (s) của toán hạng.
cũ/CPU đơn giản thường sử dụng một cái gì đó thuật toán phép nhân như thế này:
integer operator*(integer const &other) {
unsigned temp1 = other.value;
unsigned temp2 = value;
unsigned answer = 0;
while (temp1 != 0) {
if (temp1 & 1)
answer += temp2;
temp2 <<= 1;
temp1 >>=1;
}
return integer(answer);
}
Kể từ khi vòng lặp chỉ thực hiện khi/nếu temp1 != 0
, vòng lặp rõ ràng sẽ không thực hiện nếu temp1
bắt đầu ra là 0 (nhưng như được viết ở đây, sẽ không cố gắng tối ưu hóa cho toán hạng khác là 0).
Điều đó, về cơ bản là một chút tại thuật toán thời gian. Ví dụ, khi nhân các toán hạng 32 bit, nếu mỗi bit có 50:50 cơ hội được thiết lập, chúng ta dự kiến trung bình khoảng 16 lần lặp.
CPU mới hơn, cao cấp thường sẽ hoạt động với ít nhất hai bit cùng một lúc và thậm chí nhiều hơn thế. Thay vì một phần cứng duy nhất thực hiện nhiều lần lặp, nó sẽ thường hoạt động với phần cứng riêng biệt (mặc dù, về cơ bản giống hệt nhau) cho mỗi giai đoạn nhân (mặc dù chúng thường không hiển thị dưới dạng các giai đoạn riêng biệt trên sơ đồ đường ống bình thường) cho bộ vi xử lý).
Điều này có nghĩa là việc thực thi sẽ có cùng độ trễ (và thông lượng) bất kể toán hạng.Trung bình nó cải thiện độ trễ một chút và thông lượng rất nhiều, nhưng không dẫn đến mọi hoạt động xảy ra ở cùng tốc độ, bất kể toán hạng.
- 1. suy nghĩ nhân sư không rõ loại 'mysql'; bỏ qua
- 2. Newline nhân vật bỏ qua khi đọc từ bộ đệm
- 3. Làm cho git bỏ qua đổi tên
- 4. Phiên bản WinDiff hiện đại?
- 5. SVN bỏ qua không làm việc
- 6. MySQL INSERT bỏ qua không làm việc
- 7. bỏ qua các nút bằng XSLT
- 8. Bỏ qua các điểm bằng y = 0
- 9. MS Web Deploy Bỏ qua Quy tắc không bỏ qua
- 10. Định tuyến Asp.Net: Làm cách nào để bỏ qua nhiều tuyến đường ký tự đại diện?
- 11. Tại sao các đại biểu vô danh bỏ qua các đối số, nhưng lambdas không thể?
- 12. Bỏ qua SVN bỏ qua ... có thể?
- 13. Bỏ qua khoảng trống bằng PEG.js
- 14. Double.TryParse() bỏ qua NumberFormatInfo.NumberGroupSizes?
- 15. "Hiện đại" HList?
- 16. mong đợi kịch bản + làm thế nào để bỏ qua chuỗi nếu không xuất hiện
- 17. Tại sao 'svn ignore' không bỏ qua?
- 18. .gitignore không bỏ qua tệp
- 19. rvm không bỏ qua .rvmrc
- 20. UIPopoverController loại bỏ mà không có đại biểu gọi
- 21. Bỏ qua/bỏ qua thư mục/tệp trong TortoiseSVN
- 22. Mũi tên dereferencing lồng nhau trong Perl: để bỏ qua hoặc không bỏ qua?
- 23. Làm thế nào để bỏ qua nhiều lớp bằng cách sử dụng: không chọn?
- 24. Thứ tự tùy chỉnh bằng cách bỏ qua 'the'
- 25. Tính toán Hashcode tại sao nhân và bỏ qua các bit tràn?
- 26. Bỏ qua lỗi phiên bản giá bằng Rails 2.3.5
- 27. Làm thế nào để cạo bỏ nhân vật cuối cùng bằng cách sử dụng sed?
- 28. Cách hay để thực hiện điều này bằng ngôn ngữ OO C hiện đại?
- 29. Bỏ qua IgnoreAttribute
- 30. Làm thế nào để bỏ qua các tập tin hiện có, cam kết trong git?
Làm cách nào để "bỏ qua" phép nhân? Nếu nó cho 0 là kết quả, không có vấn đề làm thế nào nó nhanh như vậy, nó có hiệu lực thực hiện phép nhân. –