2012-02-17 21 views
6

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?

+1

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. –

Trả lời

-2

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 đó.

8
  1. 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).

  2. 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.

  3. 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.

  1. 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ứ.
+1

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. –

+0

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. –

+0

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

1

Đ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.

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