Tại sao phân chia phần cứng mất nhiều thời gian hơn nhân?


37

Tại sao việc phân chia phần cứng mất nhiều thời gian hơn so với nhân trên vi điều khiển? Ví dụ, trên một DSPIC, một phép chia có 19 chu kỳ, trong khi phép nhân chỉ mất một chu kỳ đồng hồ.

Tôi đã xem qua một số hướng dẫn, bao gồm thuật toán chiathuật toán nhân trên Wikipedia. Đây là lý luận của tôi.

Một thuật toán phân chia, giống như một phương pháp phân chia chậm với khôi phục trên Wikipedia, là một thuật toán đệ quy. Điều này có nghĩa là các kết quả (trung gian) từ bước kđược sử dụng làm đầu vào cho bước k+1, điều đó có nghĩa là các thuật toán này không thể song song. Do đó, phải mất ít nhất các nchu kỳ để hoàn thành việc phân chia, trong khi đó nlà một số bit trong cổ tức. Đối với cổ tức 16 bit, số tiền này bằng ít nhất 16 chu kỳ.

Một thuật toán nhân không cần phải đệ quy, điều đó có nghĩa là có thể song song hóa nó. Tuy nhiên, có nhiều thuật toán nhân khác nhau và tôi không biết được thuật toán nào có thể được sử dụng bởi các bộ vi điều khiển. Làm thế nào để nhân làm việc trên một phần cứng / vi điều khiển?

Tôi đã tìm thấy một thuật toán số nhân Dadda , được cho là chỉ mất một chu kỳ đồng hồ để hoàn thành. Tuy nhiên, điều tôi không nhận được ở đây là thuật toán của Dadda tiến hành theo ba bước, trong khi kết quả từ bước 1 được sử dụng ở bước 2, v.v. Theo đó, điều này sẽ mất ít nhất ba chu kỳ đồng hồ để hoàn thành.


2
Thuật toán không thực sự xác định số lượng chu kỳ đồng hồ. CPU cụ thể của bạn có thể có bộ nhân / bộ chia phần cứng hoạt động trong một chu kỳ hoặc 20 chu kỳ bất kể việc triển khai bên trong.
Eugene Sh.

1
OP, bạn có thể cung cấp một liên kết cung cấp thêm thông tin về chu kỳ 19 vs 1 mà bạn nói không? Một cái gì đó cụ thể về DSP của bạn.
Vladimir Cravero

1
Cảm ơn câu trả lời. Đây là một biểu dữ liệu cho vi điều khiển của tôi: ww1.microchip.com/doads/en/DeviceDoc/70005127c.pdf . Xem Tổng quan về tập lệnh, bắt đầu từ trang 292. Nó nói rằng tất cả các lệnh DIV mất 18 chu kỳ, trong khi tất cả các lệnh MUL chỉ mất 1 chu kỳ. Nhưng không chỉ phổ biến cho MCU này, tôi đã thấy điều này trong nhiều MCU khác.
Marko Gulin

2
@Curd, tốt, họ giống nhau, không phải họ. Dành cho tôi Tôi không nghĩ rằng nó minh họa nó tốt như bạn có thể tưởng tượng.
TonyM

1
Yếu tố khác là kinh tế và mô hình sử dụng. Hầu hết các cách sử dụng gọi nhân lên thường xuyên hơn nhiều so với chia. Dành một diện tích lớn silicon cho chức năng phân chia phần cứng nhanh hơn sẽ được sử dụng tương đối không thường xuyên là kinh tế kém. Tốt hơn để tạo ra một con chip nhỏ hơn và rẻ hơn, hoặc sử dụng logic bổ sung theo cách hiệu quả hơn. BTW khi tôi bắt đầu với máy tính mini, việc phân chia không phải lúc nào cũng là một hướng dẫn. Trên một số máy, đó là một cuộc gọi thư viện phần mềm, như căn bậc hai.
nigel 222

Câu trả lời:


34

Một dải phân cách ánh xạ ít thanh lịch hơn đến phần cứng thông thường. Lấy Lattice ICE40 làm ví dụ.

Chúng ta hãy so sánh hai trường hợp: hệ số nhân 8 bit này đến 16 bit:

module multiply (clk, a, b, result);
   input clk;
   input [7:0]a;
   input [7:0]b;
   output [15:0]result;
   always @(posedge clk)
     result = a * b;
endmodule // multiply

và bộ chia này làm giảm toán hạng 8 và 8 bit thành kết quả 8 bit:

module divide(clk, a, b, result);
   input clk;
   input [7:0] a;
   input [7:0] b;
   output [7:0] result;
   always @(posedge clk)
     result = a / b;
endmodule // divide

(Vâng, tôi biết, đồng hồ không làm gì cả)

Tổng quan về sơ đồ được tạo khi ánh xạ hệ số nhân vào một ICE40 FPGA có thể được tìm thấy ở đây và bộ chia ở đây .

Thống kê tổng hợp từ Yosys là:

nhân

  • Số lượng dây: 155
  • Số bit dây: 214
  • Số lượng dây công cộng: 4
  • Số bit dây công khai: 33
  • Số lượng kỷ niệm: 0
  • Số bit bộ nhớ: 0
  • Số lượng quá trình: 0
  • Số lượng tế bào: 191
    • SB_CARRY 10
    • SB_DFF 16
    • SB_LUT4 165

chia

  • Số lượng dây: 145
  • Số bit dây: 320
  • Số lượng dây công cộng: 4
  • Số bit dây công khai: 25
  • Số lượng kỷ niệm: 0
  • Số bit bộ nhớ: 0
  • Số lượng quá trình: 0
  • Số lượng tế bào: 219
    • SB_CARRY 85
    • SB_DFF 8
    • SB_LUT4 126

Điều đáng chú ý là kích thước của phiên bản được tạo cho hệ số nhân toàn chiều rộng và dải phân cách tối đa không phải là cực đoan. Tuy nhiên, nếu bạn nhìn vào các bức ảnh dưới đây, bạn sẽ nhận thấy hệ số nhân có thể có độ sâu 15, trong khi dải phân cách trông giống như 50 hoặc hơn; đường dẫn quan trọng (tức là đường dẫn dài nhất có thể xảy ra trong quá trình vận hành) là yếu tố xác định tốc độ!


Dù sao, bạn sẽ không thể đọc được điều này để có ấn tượng thị giác. Tôi nghĩ rằng sự khác biệt về sự phức tạp là có thể phát hiện ra. Đây là số nhân / bộ chia chu kỳ đơn!

nhân

Nhân trên một ICE40 (cảnh báo: ~ 100 Mpixel hình ảnh)

Hình ảnh thu nhỏ của số nhân

Chia

( Phân chia trên ICE40 ) (cảnh báo: ~ 100 Mpixel hình ảnh)

Hình ảnh thu nhỏ của dải phân cách


4
không, bạn có thể thực hiện chúng không lặp lại. Nhưng nó chỉ đơn giản sẽ mất khá nhiều thời gian cho đến khi kết quả hợp lệ "gợn sóng" thông qua logic. Việc thực hiện ở trên là không lặp lại.
Marcus Müller

9
Tôi muốn một poster tường của dải phân cách.
Ian Howson

5
Có một PDF bây giờ trong nhân ý chính. Đó là 3378 × 3177 mm, vì vậy vui lòng thảo luận với người quan trọng khác của bạn trước khi bạn đặt nó lên trần phòng ngủ.
Marcus Müller

2
Hình ảnh 100 megapixel của bạn rất ấn tượng, nhưng lại quá mức cho điểm bạn đang cố thực hiện và chúng gây ra vấn đề lớn cho bất kỳ ai đang cố xem trang này trên thiết bị có bộ nhớ hạn chế như điện thoại hoặc máy tính bảng. Nếu bạn muốn hiển thị hình ảnh nội tuyến, vui lòng tìm cách tạo ra bản xem trước độ phân giải thấp hơn.
Dave Tweed

4
Yo, những biểu đồ graphviz không hoạt động, yo!
Spencer Williams

8

Phân chia chậm vốn đã lặp đi lặp lại nên có xu hướng mất nhiều thời gian hơn. Có một số thuật toán phân chia chậm nhanh hơn một chút so với các thuật toán đơn giản, sử dụng bảng tra cứu. Thuật toán SRT tạo ra hai bit mỗi chu kỳ. Một lỗi trong bảng như vậy là nguyên nhân của lỗi Pentium FDIV khét tiếng (khoảng năm 1994). Sau đó, có cái gọi là thuật toán phân chia nhanh.

Tất nhiên, về nguyên tắc, bạn chỉ cần sử dụng một bảng tra cứu khổng lồ để tính toán sản phẩm hoặc thương số của hai số, và do đó có được kết quả trong một chu kỳ duy nhất, nhưng điều đó có xu hướng nhanh chóng trở nên không thực tế khi số bit trên mỗi số tăng.


Nhưng điểm mấu chốt là - thuật toán chia không thể song song, không giống như thuật toán nhân, và đó là lý do tại sao chúng chậm hơn rất nhiều?
Marko Gulin

2
@MarkoGulin "không thể" là một khẳng định rất mạnh mẽ. Nó chắc chắn không đơn giản.
Spehro Pefhany

2
Tôi nghĩ rằng bạn có thể làm suy yếu nó từ "các thuật toán phân chia không thể song song" thành "các cách chúng ta đã tìm thấy để song song hóa phân chia đang gây căng thẳng hơn cho phần cứng thực hiện phép chia so với phép nhân song song." Sphero đưa ra một ví dụ về cách thực hiện phép chia một chu kỳ bằng cách sử dụng cổng O (2 ^ n) để nhân các số n-bit ... nhưng điều đó không thực tế.
Cort Ammon

1
Phép chia dài có thể khai thác tính song song ở bất kỳ mức độ mong muốn nào bằng cách tính một phép đối ứng gần đúng, khi được nhân với số chia, sẽ mang lại kết quả của dạng 1000 ... xxxx, Khi làm việc với một ước số ở dạng như vậy với N đạo hàm 0, thật dễ dàng để tính N bit của kết quả với mỗi bước.
supercat

8

Chúng ta có thể có nhiều lớp logic trên mỗi chu kỳ đồng hồ nhưng có một giới hạn, chính xác có bao nhiêu lớp logic chúng ta có thể có mức độ phức tạp của các lớp đó sẽ phụ thuộc vào tốc độ xung nhịp và quy trình bán dẫn của chúng ta.

Tuy nhiên, có nhiều thuật toán nhân khác nhau và tôi không biết được thuật toán nào có thể được sử dụng bởi các bộ vi điều khiển

Hầu hết phép nhân trong máy tính sử dụng một biến thể của phép nhân dài nhị phân. Phép nhân dài nhị phân liên quan

  • Chuyển một toán hạng bằng nhiều loại đạn khác nhau
  • Che dấu các số đã thay đổi dựa trên toán hạng thứ hai
  • Thêm kết quả của mặt nạ với nhau.

Vì vậy, hãy xem việc thực hiện điều này trong phần cứng.

  • Dịch chuyển chỉ là vấn đề làm thế nào chúng ta kết nối mọi thứ, vì vậy nó miễn phí.
  • Mặt nạ đòi hỏi cổng AND. Điều đó có nghĩa là một lớp logic, vì vậy theo quan điểm thời gian, nó rẻ.
  • Ngoài ra là tương đối đắt tiền do sự cần thiết của một chuỗi mang. May mắn thay có một mẹo chúng ta có thể sử dụng. Đối với hầu hết các giai đoạn bổ sung thay vì thêm hai số để tạo một số, chúng ta có thể thêm ba số để tạo hai số.

Vì vậy, hãy cho phép ballpark có bao nhiêu giai đoạn logic mà chúng ta cần cho một số nhân 8 x 8 với kết quả 16 bit. Để đơn giản, giả sử chúng ta không thử và tối ưu hóa vì thực tế là không phải tất cả các kết quả trung gian đều có bit ở tất cả các vị trí.

Giả sử rằng một bộ cộng đầy đủ được thực hiện trong hai "giai đoạn cổng".

  • 1 cho mặt nạ để tạo ra 8 kết quả trung gian.
  • 2 để thêm các nhóm ba số để giảm 8 kết quả trung gian xuống còn 6
  • 2 để thêm các nhóm ba số để giảm 6 kết quả trung gian xuống còn 4
  • 2 để thêm một nhóm ba số để giảm 4 kết quả trung gian xuống còn 3
  • 2 để thêm một nhóm ba số để giảm 3 kết quả trung gian xuống còn 2
  • 32 để thêm hai kết quả cuối cùng.

Vì vậy, khoảng 46 giai đoạn logic tổng cộng. Hầu hết trong số đó được dành để thêm hai kết quả trung gian cuối cùng.

Điều này có thể được cải thiện hơn nữa bằng cách khai thác thực tế là không phải tất cả các kết quả trung gian đều có tất cả các bit (đó là cơ bản là hệ số nhân dada làm), bằng cách sử dụng một trình bổ sung lookahead cho bước cuối cùng. Bằng cách thêm 7 số để tạo 3 thay vì ba để tạo hai (giảm số lượng giai đoạn ở mức giá của nhiều cổng hơn và cổng rộng hơn), v.v.

Tuy nhiên, đó là tất cả các chi tiết nhỏ, điểm quan trọng là số lượng giai đoạn cần thiết để nhân hai số n bit và tạo ra kết quả 2n bit tỷ lệ thuận với n.


Mặt khác, nếu chúng ta nhìn vào các thuật toán phân chia, chúng ta thấy tất cả chúng đều có một quá trình lặp ở đâu.

  1. Những gì được thực hiện trên một lần lặp phụ thuộc nhiều vào kết quả của lần lặp trước đó.
  2. số lượng các giai đoạn logic cần thiết để thực hiện phép lặp gần như là cơ sở cho n (phép trừ và so sánh rất giống nhau về độ phức tạp của phép cộng)
  3. số lần lặp cũng tỷ lệ thuận với n.

Vì vậy, số lượng các giai đoạn logic cần thiết để thực hiện phân chia gần như tỷ lệ thuận với n bình phương.


Cảm ơn bạn vì câu trả lời. Tôi đã đọc trên Wiki rằng thuật toán của Dadda rất hiệu quả khi cần đến số lượng cổng cần thiết để thực hiện thuật toán này trên phần cứng. Mặc dù vậy, hầu hết các phần cứng sử dụng "nhân dài nhị phân"?
Marko Gulin

1
Tôi có vẻ như algotihm của dada là một phiên bản tối ưu của phép nhân dài nhị phân.
Peter Green

Tôi ghi 8 chu kỳ để thực hiện phép chia 1 / x. Sau đó, tôi sử dụng nó để nhân 8 chu kỳ với chi phí cố định là 16 chu kỳ.
b deg Nam

Điều này chứng tỏ độc đáo rằng phép nhân không quá tệ hơn so với phép cộng.
Hagen von Eitzen

1
Lặp lại yêu cầu phép trừ có thể được thực hiện trong các giai đoạn O (lgN) bằng cách sử dụng phần cứng O (NlgN) hoặc giai đoạn O (sqrt (N)) bằng phần cứng O (N). Tuy nhiên, điểm cốt yếu là phép nhân đòi hỏi các giai đoạn O (lgN), trong khi phân chia yêu cầu các giai đoạn O (NlgN). Không phải O (N * N) mà lớn hơn nhân với hệ số O (N) trừ khi người ta bắt đầu bằng cách thực hiện một nghịch đảo gần đúng để cho phép thực hiện nhiều công việc hơn trên mỗi bước.
supercat

4

Một thuật toán phân chia (trên thực tế là bất kỳ thuật toán nào) có thể được thực hiện trong một chu kỳ đồng hồ. Nếu bạn sẵn sàng trả tiền cho các bóng bán dẫn thêm và tốc độ xung nhịp cho phép thấp hơn.

Giả sử bạn có một bộ cổng thực hiện một chu kỳ xung nhịp của thuật toán phân chia nhiều chu kỳ hiện có. Để thực hiện thuật toán một chu kỳ, sử dụng nhiều giai đoạn phần cứng (tương tự như giai đoạn được sử dụng trong một giai đoạn của thuật toán đa chu kỳ), với đầu ra của một giai đoạn cho giai đoạn tiếp theo.

Tất nhiên lý do để không làm theo cách đó là vì nó sử dụng rất nhiều bóng bán dẫn. Ví dụ, đối với phân chia 16 bit, nó có thể sử dụng nhiều bóng bán dẫn hơn 16 X. Ngoài ra có nhiều giai đoạn của cổng làm giảm tần số xung nhịp tối đa được phép (vì có nhiều giai đoạn trễ lan truyền hơn).


4

Các thuật toán phân chia thực tế đều dựa trên các bộ số hội tụ đến thương số.

  • Có các phương pháp phụ gia, như không khôi phục hoặc SRT hoạt động bằng cách thêm hoặc xóa 2 ^ N vào thương số và tương ứng thêm hoặc xóa 2 ^ N * Divisor cho phần còn lại cho đến khi nó hội tụ về 0.

  • Có các phương pháp nhân, như Newton-Raphson hoặc Goldshmidth, là các phương pháp tìm gốc trong đó phép chia được tính là nghịch đảo của phép nhân.

Các phương thức cộng gộp cho một hoặc một vài bit mỗi chu kỳ. Các phương pháp nhân đôi số lượng bit cho mỗi chu kỳ nhưng cần một số xấp xỉ ban đầu, thường thu được với một bảng không đổi.

Các mệnh giá "chậm" và "nhanh" là sai lệch, vì tốc độ thực tế phụ thuộc vào số lượng bit, bao nhiêu phần cứng được dành cho chức năng (và số nhân nhanh là rất lớn) ...

Phép chia chậm hơn phép nhân vì không có phương pháp trực tiếp, song song để tính toán nó: Hoặc có một phép lặp hoặc phần cứng được sao chép để thực hiện phép lặp dưới dạng khối xếp tầng (hoặc đường ống).


0

Tại sao việc phân chia phần cứng mất nhiều thời gian hơn so với nhân trên vi điều khiển?

Đây không phải là một câu hỏi điện tử. Tốt nhất đó là một câu hỏi trên máy tính, được giải quyết tốt hơn cho Stack Overflow.

Xem, ví dụ, ở đây: Phép nhân có nhanh hơn phép chia float không?

Trong thực tế, đó là một câu hỏi trong cuộc sống thực: Tại sao sự phân chia lại mất nhiều thời gian hơn nhân lên?

Mà bạn sẽ tính toán trên giấy?

51 * 82

hoặc là

4182 / 51

Phân chia mất nhiều thời gian hơn nhân vì khó thực hiện hơn .

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.