Tại sao bổ sung nhanh như các hoạt động khôn ngoan trong bộ xử lý hiện đại?


73

Tôi biết rằng các hoạt động khôn ngoan bit rất nhanh trên các bộ xử lý hiện đại, bởi vì chúng có thể hoạt động song song trên 32 hoặc 64 bit, vì vậy các hoạt động khôn ngoan bit chỉ mất một chu kỳ xung nhịp. Tuy nhiên, bổ sung là một hoạt động phức tạp bao gồm ít nhất một và có thể lên đến hàng tá hoạt động khôn ngoan, vì vậy tôi tự nhiên nghĩ rằng nó sẽ chậm hơn 3-4 lần. Tôi đã ngạc nhiên khi thấy sau một điểm chuẩn đơn giản rằng sự bổ sung này chính xác nhanh như bất kỳ thao tác bit-khôn ngoan nào (XOR, OR, AND, v.v.). bất cứ ai có thể làm sáng tỏ về điều này?




1
Đúng, phép nhân cũng khá nhanh trong các bài kiểm tra của tôi. Nó chỉ chậm hơn khoảng 2 lần so với bổ sung, trong khi phân chia chậm hơn khoảng 30 lần (!).
SoloNasus

Tổng quan nhỏ gọn về các trình bổ sung cây tiền tố song song hiện đại: Phân loại mạng tiền tố song song của David Harris: Pages.hmc.edu/harris/research/taxonomy.pdf
Franki

More xây dựng: luận án "cấu trúc song song-prefix cho nhị phân và modulo {2n-1, 2n, 2n + 1} adders" tiến sĩ Tiến sĩ Jun Chen của digital.library.okstate.edu/etd/Chen_okstate_0664D_10070.pdf
Franki

Câu trả lời:


104

Bổ sung là nhanh vì các nhà thiết kế CPU đã đưa vào các mạch cần thiết để làm cho nó nhanh. Nó có nhiều cổng hơn đáng kể so với các thao tác bitwise, nhưng nó thường đủ để các nhà thiết kế CPU đánh giá nó có giá trị. Xem https://en.wikipedia.org/wiki/Adder_(electronics) .

Cả hai có thể được thực hiện đủ nhanh để thực hiện trong một chu kỳ CPU. Chúng không nhanh bằng nhau - việc bổ sung đòi hỏi nhiều cổng và độ trễ hơn so với thao tác theo bit - nhưng nó đủ nhanh để bộ xử lý có thể thực hiện trong một chu kỳ đồng hồ. Có một chi phí trễ cho mỗi hướng dẫn cho việc giải mã và điều khiển logic, và độ trễ cho nó lớn hơn đáng kể so với độ trễ để thực hiện thao tác theo bit, do đó, sự khác biệt giữa hai điều này bị lấn át bởi chi phí đó. Câu trả lời của AProgrammercâu trả lời của Paul92 giải thích rõ những hiệu ứng đó.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
DW

38

Có một số khía cạnh.

  • Chi phí tương đối của một hoạt động bitwise và một bổ sung. Một adder ngây thơ sẽ có độ sâu cổng phụ thuộc tuyến tính vào độ rộng của từ. Có các cách tiếp cận khác nhau, tốn kém hơn về mặt cổng, làm giảm độ sâu (IIRC độ sâu sau đó phụ thuộc vào logarit về độ rộng của từ). Những người khác đã đưa ra các tài liệu tham khảo cho các kỹ thuật như vậy, tôi sẽ chỉ ra rằng sự khác biệt cũng ít quan trọng hơn so với những gì có vẻ như chỉ xem xét chi phí của hoạt động vì nhu cầu logic điều khiển làm tăng độ trễ.

  • Sau đó, có một thực tế là các bộ xử lý thường có xung nhịp (Tôi biết về một số nghiên cứu hoặc các thiết kế không dành cho mục đích đặc biệt, nhưng tôi thậm chí không chắc chắn rằng một số có sẵn trên thị trường). Điều đó có nghĩa là bất kể tốc độ của một hoạt động là gì, nó sẽ mất một bội số nguyên của chu kỳ đồng hồ.

  • Cuối cùng, có những cân nhắc về kiến ​​trúc vi mô: bạn có chắc chắn rằng bạn đo được những gì bạn muốn không? Ngày nay, các bộ xử lý có xu hướng được xử lý theo đường ống, đa hướng, với việc thực hiện không theo thứ tự và bất cứ điều gì khác. Điều đó có nghĩa là họ có thể thực hiện một số hướng dẫn cùng một lúc, ở các giai đoạn hoàn thành khác nhau. Nếu bạn muốn thể hiện bằng các phép đo rằng một hoạt động cần nhiều thời gian hơn một hoạt động khác, bạn phải xem xét các khía cạnh đó vì mục tiêu của chúng là che giấu sự khác biệt đó. Bạn rất có thể có cùng thông lượng cho các hoạt động bổ sung và bitwise khi sử dụng dữ liệu độc lập nhưng thước đo độ trễ hoặc giới thiệu phụ thuộc giữa các hoạt động có thể hiển thị khác. Và bạn cũng phải chắc chắn rằng nút cổ chai của biện pháp của bạn nằm trong thực thi và không phải là ví dụ trong bộ nhớ truy cập.


6
+1. Có, hầu hết các bộ xử lý đều có xung nhịp, nhưng một vài CPU không có xung nhịp có sẵn trên thị trường.
David Cary

2
Một khả năng khác là bộ xử lý có thể lưu trữ một thanh ghi 64 bit dưới dạng một mảnh 16 bit và ba mảnh 17 bit, trong đó các bit thừa của mỗi mảnh giữ một vật mang hoãn lại từ bên dưới. Một bổ sung được theo sau bởi một hoạt động theo chiều bit hoặc một cửa hàng có thể cần 1-2 chu kỳ bổ sung để tuyên truyền việc mang theo, nhưng một bổ sung được theo sau bởi một bổ sung khác thì không. Hơn nữa, trong trường hợp "cửa hàng", thời gian lan truyền thêm có thể làm chậm hiệu suất của cửa hàng, nhưng sẽ không cần mã để "chờ" cho nó.
supercat

3
@supercat Pentium 4 đã làm một cái gì đó như thế này, với tốc độ gấp đôi (so với phần còn lại của bộ xử lý) ALU sẽ có 16 hoặc 32 bit thấp sẵn sàng cho hoạt động tiếp theo nửa chu kỳ trước các bit của nửa trên.
Jeffrey Bosboom

2
bạn có chắc chắn rằng bạn đo những gì bạn muốn? Trong trường hợp này, kết luận của OP từ các phép đo xảy ra là chính xác đối với đại đa số CPU. Bổ sung phổ biến đến mức CPU siêu khối có thêm đơn vị trên tất cả các cổng thực thi và booleans rất rẻ để thực hiện (tính theo số lượng bóng bán dẫn) mà chúng cũng có mặt trên tất cả các cổng. Vì vậy, add và booleans hầu như luôn có cùng thông lượng (ví dụ 4 trên mỗi đồng hồ trong Intel Haswell).
Peter Cordes

2
Mặc dù vậy, số nguyên SIMD thường có thông lượng thấp hơn so với boolean SIMD, mặc dù chúng thường có cùng độ trễ. Các CPU Intel từ PentiumII đến Broadwell chỉ có thể chạy vector-int thêm (ví dụ paddw) ở mức 2 mỗi đồng hồ, nhưng booleans (như pand) ở mức 3 mỗi đồng hồ. (Skylake đặt một bộ cộng vector vào cả ba cổng thực thi vector.)
Peter Cordes

24

CPU hoạt động theo chu kỳ. Ở mỗi chu kỳ, một cái gì đó xảy ra. Thông thường, một lệnh mất nhiều chu kỳ hơn để thực thi, nhưng nhiều lệnh được thực thi cùng một lúc, ở các trạng thái khác nhau.

Ví dụ, một bộ xử lý đơn giản có thể có 3 bước cho mỗi hướng dẫn: tìm nạp, thực thi và lưu trữ. Bất cứ lúc nào, 3 hướng dẫn đang được xử lý: một hướng dẫn đang được tìm nạp, một hướng dẫn đang được thực thi và một hướng dẫn lưu trữ kết quả của nó. Đây được gọi là một đường ống dẫn và có trong ví dụ này 3 giai đoạn. Bộ xử lý hiện đại có đường ống với hơn 15 giai đoạn. Tuy nhiên, ngoài ra, cũng như hầu hết các phép toán số học, thường được thực hiện trong một giai đoạn (tôi đang nói về hoạt động thêm 2 số bằng ALU, chứ không phải về chính lệnh - tùy thuộc vào kiến ​​trúc bộ xử lý, lệnh có thể yêu cầu nhiều chu kỳ hơn để tìm nạp các đối số từ bộ nhớ, thực hiện các điều kiện, lưu trữ kết quả vào bộ nhớ).

Thời lượng của một chu kỳ được xác định bởi con đường quan trọng dài nhất. Về cơ bản, đó là khoảng thời gian dài nhất cần thiết cho một số giai đoạn của đường ống hoàn thành. Nếu bạn muốn làm cho CPU nhanh hơn, bạn cần tối ưu hóa đường dẫn quan trọng. Nếu không thể giảm đường dẫn quan trọng mỗi lần, nó có thể được chia thành 2 giai đoạn của đường ống và giờ đây bạn có thể theo dõi CPU của mình với tần số gần gấp đôi (giả sử không có đường dẫn quan trọng nào khác ngăn bạn thực hiện việc này ). Nhưng điều này đi kèm với một chi phí chung: bạn cần chèn một thanh ghi giữa các giai đoạn của đường ống. Điều đó có nghĩa là bạn không thực sự đạt được tốc độ gấp đôi (đăng ký cần thời gian để lưu trữ dữ liệu) và bạn đã làm phức tạp toàn bộ thiết kế.

Hiện đã có các phương pháp khá hiệu quả để thực hiện bổ sung (ví dụ: mang theo các bộ bổ sung lookahead) và bổ sung không phải là một đường dẫn quan trọng cho tốc độ của bộ xử lý, do đó không có nghĩa là chia nó thành nhiều chu kỳ.

Ngoài ra, lưu ý rằng mặc dù nó có vẻ phức tạp đối với bạn, nhưng trong phần cứng, mọi thứ có thể được thực hiện song song rất nhanh.


3
Chi phí lớn từ các đường ống dài hơn là nhiều chu kỳ hơn để phục hồi sau khi hiểu sai chi nhánh! Chi tiêu bóng bán dẫn để đệm dữ liệu giữa các giai đoạn là nhỏ trong những ngày này. Ngay cả một CPU có đường ống đơn giản cũng phải tìm nạp / giải mã trước các hướng dẫn thực sự đang thực thi. Nếu CPU phát hiện ra rằng giao diện người dùng đang làm sai mã do một nhánh đi theo một cách khác so với dự đoán (hoặc một số suy đoán sai khác), thì nó phải loại bỏ công việc đó và bắt đầu từ hướng dẫn chính xác. Mọi thứ chỉ trở nên tồi tệ hơn với các CPU không theo thứ tự siêu lớn có thể có nhiều điểm trong chuyến bay.
Peter Cordes

12

Bộ xử lý được đặt xung nhịp, vì vậy ngay cả khi một số hướng dẫn rõ ràng có thể được thực hiện nhanh hơn các hướng dẫn khác, chúng cũng có thể thực hiện cùng một số chu kỳ.

Bạn có thể thấy rằng các mạch cần thiết để vận chuyển dữ liệu giữa các thanh ghi và các đơn vị thực thi phức tạp hơn đáng kể so với các bộ cộng.

Lưu ý rằng lệnh MOV (đăng ký để đăng ký) đơn giản thậm chí còn ít tính toán hơn logic bitwise, tuy nhiên cả MOV và ADD thường mất một chu kỳ. Nếu MOV có thể được thực hiện nhanh gấp đôi, CPU sẽ có tốc độ nhanh gấp đôi và ADD sẽ là hai chu kỳ.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Gilles

1
Tóm tắt cuộc thảo luận: một số CPU không theo thứ tự xử lý MOV đặc biệt với việc đổi tên đăng ký, với độ trễ bằng không thực sự. Xem MOV của x86 có thực sự là miễn phí không? Tại sao tôi không thể tái tạo điều này? để biết chi tiết đầy đủ về những gì MOV thực sự có giá.
Peter Cordes

12

Bổ sung là đủ quan trọng để không phải chờ bit carry thông qua bộ tích lũy 64 bit: thuật ngữ đó là một bộ cộng mang theo và về cơ bản chúng là một phần của CPU 8 bit (và ALU của chúng) trở lên. Thật vậy, các bộ xử lý hiện đại có xu hướng không cần nhiều thời gian thực hiện hơn cho phép nhân hoàn toàn: carry-lookahead thực sự là một công cụ thực sự cũ (và tương đối phải chăng) trong hộp công cụ của nhà thiết kế bộ xử lý.


Phép nhân số nguyên chắc chắn là độ trễ cao hơn và thông lượng thấp hơn so với ADD trên x86. Nhưng thật nhanh chóng khi xem xét có bao nhiêu trình bổ sung để xây dựng một hệ số nhân nhanh: ví dụ như trên Intel kể từ Nehalem và AMD kể từ Ryzen, nhân số nguyên vô hướng 8/16/32/64-bit là độ trễ 3 chu kỳ, với thông lượng trên 1 chu kỳ (một đơn vị thực hiện đầy đủ đường ống). Điều này hút so với thông lượng ADD 3 hoặc 4 mỗi đồng hồ, nhưng thật đáng kinh ngạc so với độ trễ IMUL 9 chu kỳ trong Intel Pentium P5. Mọi thứ tương tự đối với SIMD: vectơ int-int có độ trễ cao hơn và thông lượng thấp hơn so với add, nhưng vẫn nhanh.
Peter Cordes

Vì vậy, có, nhân được sử dụng để đắt hơn nhiều so với các hướng dẫn khác so với bây giờ. Tránh nó với chi phí nhiều hơn 2 hướng dẫn thường không có giá trị và đôi khi, ngay cả một thay thế 2 hướng dẫn cũng đáng giá (ví dụ: với một ca làm việc + thêm leahướng dẫn).
Peter Cordes

9

Tôi nghĩ rằng bạn khó có thể tìm thấy một bộ xử lý có thêm chu kỳ hơn là hoạt động theo bit. Một phần vì hầu hết các bộ xử lý phải thực hiện ít nhất một bổ sung cho mỗi chu kỳ lệnh chỉ đơn giản là để tăng bộ đếm chương trình. Chỉ hoạt động bitwise không phải là tất cả hữu ích.

(Chu kỳ hướng dẫn, không phải chu kỳ xung nhịp - ví dụ: 6502 mất tối thiểu hai chu kỳ xung nhịp cho mỗi lệnh do không được đặt đường ống và không có bộ đệm hướng dẫn)

Khái niệm thực sự bạn có thể thiếu là về con đường quan trọng : trong một con chip, hoạt động dài nhất có thể được thực hiện trong một chu kỳ, ở cấp độ phần cứng, con chip có thể được chạy nhanh như thế nào.

Ngoại lệ cho điều này là logic không đồng bộ (hiếm khi được sử dụng và hầu như không được thương mại hóa), thực sự thực hiện ở các tốc độ khác nhau tùy thuộc vào thời gian truyền logic, nhiệt độ thiết bị, v.v.


Đây không phải là thao tác bitwise do người dùng kiểm soát, nhưng một số hướng dẫn trên 8086 (ví dụ: xóa cờ ngắt ) mất ít chu kỳ hơn so với phép cộng số nguyên. Tóm tắt hơn, một hệ thống RISC trong đó tất cả các hướng dẫn có kích thước một từ có thể sử dụng bộ đếm nhị phân đơn giản cho PC, đây sẽ là một mạch nhanh hơn nhiều so với một bộ cộng đa năng.
Đánh dấu

Bổ sung trên bộ đếm chương trình có xu hướng rất đơn giản so với một lệnh số học bổ sung, bởi vì một trong các toán hạng là nhỏ (kích thước lệnh hoặc độ lệch nhảy tương đối cũng bị giới hạn kích thước)
Ben Voigt

6502 đã được pipelined - nó đọc byte đầu tiên của lệnh tiếp theo trong chu kỳ cuối cùng của lần trước. Nếu không, tìm nạp / giải mã / thực thi sẽ có ít nhất ba chu kỳ.
gnasher729

8

Ở cấp độ cổng, bạn chính xác rằng phải mất nhiều công sức hơn để làm bổ sung, và do đó mất nhiều thời gian hơn. Tuy nhiên, chi phí đó đủ tầm thường mà không thành vấn đề.

Bộ xử lý hiện đại được đồng hồ. Bạn không thể làm hướng dẫn ở bất cứ điều gì ngoại trừ bội số của tốc độ xung nhịp này. Nếu tốc độ xung nhịp được đẩy lên cao hơn, để tối đa hóa tốc độ của các hoạt động theo bit, bạn sẽ phải dành ít nhất 2 chu kỳ cho việc bổ sung. Phần lớn thời gian này sẽ được dành để chờ đợi vì bạn không thực sự cần đến 2 chu kỳ đáng giá. Bạn chỉ cần 1.1 (hoặc một số số như vậy). Bây giờ chip của bạn thêm chậm hơn so với những người khác trên thị trường.

Tồi tệ hơn, hành động đơn thuần là thêm hoặc thực hiện các thao tác bitwise chỉ là một phần nhỏ của những gì đang diễn ra trong một chu kỳ. Bạn phải có thể tìm nạp / giải mã các hướng dẫn trong một chu kỳ. Bạn phải có khả năng thực hiện các thao tác bộ đệm trong một chu kỳ. Rất nhiều thứ khác đang diễn ra trong cùng một khoảng thời gian như phép cộng đơn giản hoặc thao tác bitwise.

Tất nhiên, giải pháp là phát triển một đường ống sâu ồ ạt, phá vỡ các nhiệm vụ này thành các phần nhỏ phù hợp với thời gian chu kỳ nhỏ được xác định bởi hoạt động theo bit. Pentium 4 nổi tiếng cho thấy giới hạn của suy nghĩ trong các điều khoản đường ống sâu này. Tất cả các loại vấn đề phát sinh. Cụ thể, việc phân nhánh trở nên khó khăn vì bạn phải làm sạch đường ống một khi bạn có dữ liệu để tìm ra nhánh nào sẽ thực hiện.


7

Bộ xử lý hiện đại được đồng hồ: Mỗi hoạt động cần một số chu kỳ đồng hồ không thể thiếu. Các nhà thiết kế của bộ xử lý xác định độ dài của một chu kỳ đồng hồ. Có hai cân nhắc ở đó: Một, tốc độ của phần cứng, ví dụ được đo bằng độ trễ của một cổng NAND. Điều này phụ thuộc vào công nghệ được sử dụng và vào sự đánh đổi như tốc độ so với việc sử dụng năng lượng. Nó độc lập với thiết kế bộ xử lý. Hai, các nhà thiết kế quyết định rằng độ dài của chu kỳ đồng hồ bằng n độ trễ của một cổng NAND, trong đó n có thể là 10, hoặc 30 hoặc bất kỳ giá trị nào khác.

Lựa chọn này n giới hạn cách các hoạt động phức tạp có thể được xử lý trong một chu kỳ. Sẽ có các hoạt động có thể được thực hiện trong 16 nhưng không phải là chậm trễ 15 NAND. Vì vậy, chọn n = 16 có nghĩa là một thao tác như vậy có thể được thực hiện trong một chu kỳ, chọn n = 15 có nghĩa là không thể thực hiện được.

Các nhà thiết kế sẽ chọn n để nhiều thao tác quan trọng có thể được thực hiện trong một, hoặc có thể hai hoặc ba chu kỳ. n sẽ được chọn tối ưu cục bộ: Nếu bạn thay thế n bằng n-1, thì hầu hết các thao tác sẽ nhanh hơn một chút, nhưng một số (những hoạt động thực sự cần độ trễ NAND đầy đủ) sẽ chậm hơn. Nếu một vài thao tác sẽ chậm lại, do đó việc thực hiện chương trình tổng thể trung bình nhanh hơn, thì bạn đã chọn n-1. Bạn cũng có thể đã chọn n + 1. Điều đó làm cho hầu hết các hoạt động chậm hơn một chút, nhưng nếu bạn có nhiều thao tác không thể thực hiện trong độ trễ n nhưng có thể được thực hiện trong độ trễ n + 1 thì nó sẽ làm cho bộ xử lý tổng thể nhanh hơn.

Bây giờ câu hỏi của bạn: Thêm và trừ là các hoạt động phổ biến đến mức bạn muốn có thể thực hiện chúng trong một chu kỳ duy nhất. Kết quả là, AND, OR, vv không thể thực thi nhanh hơn: Họ vẫn cần một chu kỳ đó. Tất nhiên, đơn vị "tính toán" VÀ, HOẶC vv có rất nhiều thời gian để xoay tròn ngón tay cái của nó, nhưng điều đó không thể giúp được.

Lưu ý rằng đó không chỉ là liệu một thao tác có thể được thực hiện trong thời gian trễ NAND hay không: Ví dụ, một sự bổ sung có thể được thực hiện nhanh hơn bằng cách khéo léo một chút, vẫn nhanh hơn bằng cách rất thông minh, vẫn nhanh hơn một chút bằng cách đầu tư số lượng phần cứng đặc biệt và cuối cùng, một bộ xử lý có thể có một hỗn hợp rất nhanh rất đắt và các mạch rẻ hơn và chậm hơn một chút, do đó, có khả năng thực hiện một thao tác chỉ đủ nhanh bằng cách chi nhiều tiền hơn cho nó.

Bây giờ bạn có thể làm cho tốc độ xung nhịp cao / chu kỳ ngắn đến mức chỉ các hoạt động bit đơn giản thực hiện trong một chu kỳ và mọi thứ khác trong hai hoặc nhiều hơn. Điều đó rất có thể sẽ làm chậm bộ xử lý. Đối với các hoạt động có hai chu kỳ, thường có chi phí chung để chuyển một lệnh không hoàn chỉnh từ chu kỳ này sang chu kỳ tiếp theo, vì vậy hai chu kỳ không có nghĩa là bạn có thời gian thực hiện gấp đôi. Vì vậy, để thực hiện bổ sung trong hai chu kỳ, bạn không thể tăng gấp đôi tốc độ đồng hồ.


6

Hãy để tôi sửa một vài điều không được đề cập rõ ràng trong câu trả lời hiện có của bạn:

Tôi biết rằng các hoạt động bitwise rất nhanh trên các bộ xử lý hiện đại, bởi vì chúng có thể hoạt động song song trên 32 hoặc 64 bit,

Đây là sự thật. Việc gắn nhãn CPU là bit "XX" thường (không phải luôn luôn) có nghĩa là hầu hết các cấu trúc phổ biến của nó (độ rộng thanh ghi, RAM có thể định địa, v.v.) có kích thước XX (thường là "+/- 1" hoặc somesuch). Nhưng liên quan đến câu hỏi của bạn, bạn có thể giả định một cách an toàn rằng CPU có 32 bit hoặc 64 bit sẽ thực hiện bất kỳ hoạt động bit cơ bản nào trên 32 hoặc 64 bit trong thời gian không đổi.

vì vậy các hoạt động bitwise chỉ mất một chu kỳ đồng hồ.

Kết luận này không nhất thiết là trường hợp. Đặc biệt là CPU có bộ hướng dẫn phong phú (google CISC so với RISC) có thể dễ dàng thực hiện nhiều hơn một chu kỳ cho các lệnh đơn giản. Với xen kẽ, các lệnh mô phỏng thậm chí có thể được chia thành fetch-exec-store với 3 đồng hồ (làm ví dụ).

Tuy nhiên, nghiện là một hoạt động phức tạp

Không, bổ sung số nguyên là một hoạt động đơn giản; trừ cũng vậy. Rất dễ dàng để thực hiện các trình bổ sung trong phần cứng đầy đủ và chúng thực hiện công việc của chúng ngay lập tức như các hoạt động bit cơ bản.

bao gồm ít nhất một và có thể lên đến hàng chục thao tác bitwise, vì vậy tôi tự nhiên nghĩ rằng nó sẽ chậm hơn 3-4 lần.

Nó sẽ mất gấp 3-4 lần nhiều bóng bán dẫn, nhưng so với bức tranh lớn thì không thể bỏ qua.

Tôi đã rất ngạc nhiên khi thấy sau một điểm chuẩn đơn giản rằng sự bổ sung này chính xác nhanh như bất kỳ thao tác bitwise nào (XOR, OR, AND, v.v.). bất cứ ai có thể làm sáng tỏ về điều này?

Có: phép cộng số nguyên một phép toán bitwise (với một vài bit hơn các bit khác, nhưng vẫn còn). Không cần phải làm bất cứ điều gì trong các giai đoạn, không cần các thuật toán phức tạp, đồng hồ hoặc bất cứ điều gì khác.

Nếu bạn muốn thêm nhiều bit hơn kiến ​​trúc CPU của mình, bạn sẽ phải chịu một hình phạt là phải thực hiện theo các giai đoạn. Nhưng đây là một mức độ phức tạp khác (cấp độ ngôn ngữ lập trình, không phải cấp độ lắp ráp / mã máy). Đây là một vấn đề phổ biến trong quá khứ (hoặc ngày nay trên các CPU nhúng nhỏ). Đối với PC, v.v., 32 hoặc 64 bit của chúng là đủ cho các loại dữ liệu phổ biến nhất để điều này bắt đầu trở thành điểm tranh luận.


Thật thú vị khi lưu ý rằng việc giảm chi phí thời gian bổ sung từ O (N) sang O (sqrt (N)) không làm tăng đáng kể số lượng bóng bán dẫn hoặc độ phức tạp định tuyến cần thiết (mỗi giai đoạn chỉ cần để một người mang dây lẻn từ bên dưới và cần phải có các giai đoạn hợp nhất thêm sqrt (N). Chi phí thời gian có thể giảm xuống O (lgN) với chi phí của bóng bán dẫn O (lgN), nhưng trong nhiều trường hợp có thể hữu ích để xử lý một cái gì đó như 64- Ngoài ra, ví dụ như tám bổ sung 8 bit (sử dụng chuyển tiếp sqrtN) được nối với ba lớp logic hợp nhất, thay vì 64 1 bit thêm với sáu lớp hợp nhất.
supercat

Yeah, adders khá đơn giản. Điều thực sự ấn tượng là các CPU x86 hiện đại với hệ số nhân 64 bit có độ trễ 3 chu kỳ đầy đủ . (ví dụ: imul rax, rcxcó độ trễ 3c và thông lượng trên 1c trên gia đình Intel Sandybridge và AMD Ryzen). Ngay cả phép nhân đầy đủ 64 bit (tạo ra kết quả 128 bit trong rdx: rax) có cùng độ trễ và thông lượng, nhưng được triển khai dưới dạng 2 uops (chạy song song trên các cổng khác nhau). (Xem agner.org/optizes để biết bảng hướng dẫn và hướng dẫn microarch tuyệt vời).
Peter Cordes

[add-with-carry] ở một mức độ phức tạp khác (cấp độ ngôn ngữ lập trình, không phải cấp độ lắp ráp / mã máy . Nó phụ thuộc vào ngôn ngữ. Trình biên dịch AC nhắm mục tiêu CPU 16 bit phải phát ra add / adc cho bạn khi biên dịch Ngoài ra còn có hai uint32_tgiá trị. Điều này vẫn còn phù hợp với int64_t trên các mục tiêu 32 bit. AVR là bộ vi điều khiển RISC 8 bit, do đó, số nguyên 32 bit yêu cầu 4 hướng dẫn: godbolt.org/g/wre0fM
Peter Cordes

Vâng, @PeterCordes, đó là những gì tôi muốn nói, tôi đã làm rõ câu nói của mình một chút.
AnoE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.