Tại sao phép chia lại phức tạp hơn nhiều so với các phép toán số học khác?


39

Gần đây tôi đã gặp một trường hợp tôi cần một hoạt động phân chia số nguyên trên một con chip thiếu một (ARM Cortex-A8). Trong khi cố gắng nghiên cứu lý do tại sao phải như vậy, tôi phát hiện ra rằng trong phép chia tổng quát có nhiều chu kỳ hơn phép cộng, phép trừ hoặc phép nhân trên khá nhiều kiến ​​trúc số nguyên (hoặc điểm cố định). Tại sao điều này là trường hợp? Có phải nó không thể biểu diễn bằng logic AND-OR hai lớp như mọi thứ khác không?

Câu trả lời:


34

Phân chia là một thuật toán lặp trong đó kết quả từ thương số phải được chuyển sang phần còn lại bằng cách sử dụng thước đo Euclide, xem 2 ; trong khi đó, phép nhân có thể được giảm xuống thành một chuỗi (cố định) các thủ thuật thao tác bit.


2
Nó đã từng là cả nhân và chia là hoạt động chậm. Ngày nay phép nhân nhanh hơn một chút (nhưng chậm hơn một chút so với phép cộng / phép trừ), nhưng phép chia vẫn chậm hơn các cách khác. Tôi tin rằng Newton-Raphson vẫn được sử dụng nội bộ bởi hầu hết để đối ứng một số.
JM

12
(Ngoài chủ đề: "Các thao tác nghịch đảo thường khó. Chỉ cần nhìn vào tích hợp so với phân biệt." - phụ thuộc vào việc bạn đang làm là biểu tượng hay số. Sự khác biệt là dễ dàng về mặt tượng trưng, ​​nhưng khó về mặt số lượng, tích hợp là khó về mặt tượng trưng, ​​nhưng về mặt số lượng dễ dàng.)
JM

1
Được rồi, tôi sẽ xử lý bằng cách nói rằng hình khối là một loại giun khác nhau; nhưng ít nhất trong trường hợp một chiều, cầu phương dễ hơn phân biệt.
JM

1
Trong mọi trường hợp, nghịch đảo luôn đi theo cặp. Tại sao bạn lại gọi một "hoạt động" và cái còn lại là "nghịch đảo"?
David Ketcheson

2
Không lặp đi lặp lại hay nghịch đảo làm cho nó khó hơn. Độ khó của sự phân chia xuất phát từ việc bạn phải chuyển kết quả từ thương số sang phần còn lại bằng cách sử dụng biện pháp Euclide. Xem định lý thuật toán chia .

20

Mặc dù tất cả các CPU hiện tại dường như sử dụng một cách tiếp cận lặp đi lặp lại như gợi ý , nhưng đã có một số công việc được thực hiện trên các phương pháp không lặp lại. Phòng Point biến chính xác Floating và Square Root cuộc đàm phán về việc thực hiện không lặp đi lặp lại của sự phân chia điểm và căn bậc hai trôi nổi trong một FPGA , sử dụng tra cứu bảng và mở rộng loạt taylor.

Tôi nghi ngờ rằng các kỹ thuật tương tự có thể khiến các hoạt động này giảm xuống theo một chu kỳ duy nhất (thông lượng, nếu không phải là độ trễ), nhưng bạn có thể cần các bảng tra cứu khổng lồ , và do đó, rất lớn các khu vực bất động sản silicon để thực hiện .

Tại sao nó không khả thi?

Trong việc thiết kế CPU, có rất nhiều sự đánh đổi. Chức năng, độ phức tạp (số lượng bóng bán dẫn), tốc độ và mức tiêu thụ điện đều có liên quan đến nhau và các quyết định được đưa ra trong quá trình thiết kế có thể ảnh hưởng rất lớn đến hiệu suất.

Một bộ xử lý hiện đại có thể có một đơn vị điểm nổi chính dành đủ các bóng bán dẫn trên silicon để thực hiện phân chia điểm nổi trong một chu kỳ duy nhất , nhưng sẽ không chắc là sử dụng hiệu quả các bóng bán dẫn đó.

Điểm nổi nhân lên đã thực hiện quá trình chuyển đổi này từ lặp đi lặp lại sang không lặp lại một thập kỷ trước. Ngày nay, chu kỳ đơn nhân và thậm chí nhân lên là phổ biến, ngay cả trong các bộ xử lý di động.

Trước khi nó trở thành việc sử dụng hiệu quả ngân sách bóng bán dẫn, nhân, như phân chia, thường được thực hiện bằng phương pháp lặp. Trước đó, các bộ xử lý DSP chuyên dụng có thể dành phần lớn silicon của chúng cho một đơn vị tích lũy nhân nhanh (MAC) . CPU Core2duo có độ trễ nhân 3 điểm trôi nổi (giá trị xuất phát từ chu kỳ 3 của đường ống sau khi đi vào), nhưng có thể có 3 lần nhân trong một chuyến bay, dẫn đến thông lượng một chu kỳ, trong khi đó đơn vị SSE2 có thể bơm ra nhiều bội số FP trong một chu kỳ.

Thay vì dành những vùng silicon khổng lồ cho một đơn vị phân chia một chu kỳ, CPU hiện đại có nhiều đơn vị, mỗi đơn vị có thể thực hiện các hoạt động song song, nhưng được tối ưu hóa cho các tình huống cụ thể của riêng chúng. Trên thực tế, một khi bạn tính đến các hướng dẫn SIMD như SSE hoặc đồ họa tích hợp CPU của Sandy Bridge hoặc CPU sau này, có thể có nhiều đơn vị phân chia điểm nổi như vậy trên CPU của bạn.

Nếu việc phân chia điểm nổi chung quan trọng hơn với CPU hiện đại thì có lẽ nên dành đủ diện tích silicon để tạo ra chu kỳ đơn, tuy nhiên hầu hết các nhà sản xuất chip rõ ràng đã quyết định rằng họ có thể sử dụng silicon đó tốt hơn bằng cách sử dụng các cổng đó cho những thứ khác . Do đó, một thao tác chậm hơn, nhưng về tổng thể (đối với các tình huống sử dụng thông thường), CPU nhanh hơn và / hoặc tiêu thụ ít năng lượng hơn.


Theo hiểu biết của tôi, không có chip nào có độ trễ phân chia một chu kỳ cho điểm nổi. Ví dụ: các bảng hướng dẫn của Agner Fog cho CPU Intel, AMD và VIA liệt kê DIVPS (phân chia điểm nổi đóng gói SSE) theo chu kỳ 10-14. Tôi không thể tìm thấy bất kỳ phần cứng nào có hướng dẫn phân chia một chu kỳ, nhưng tôi sẵn sàng bị chứng minh là sai. Nó không phổ biến như tôi có thể nói.
Bill Barth

@Bill - Cảm ơn, bạn đã đúng. Tôi chắc chắn tôi đã thấy các hoạt động phân chia một chu kỳ trong các chip DSP trước đây, vì vậy, giả sử rằng nó sẽ được chuyển sang máy tính để bàn, giống như nhân một chu kỳ đơn, nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào bây giờ. Tôi đã cập nhật câu trả lời của mình và thêm một số thông tin có liên quan về các phương pháp không lặp lại có thể cho phép nó trong tương lai. Thật đáng kinh ngạc khi nghĩ rằng sự phân chia không hiệu quả hơn theo chu kỳ bây giờ so với khi tôi sử dụng bộ chuyển đổi.
Đánh dấu gian hàng

1
Tôi nghĩ DSP làm điều đó bằng cách giới hạn phạm vi mà chúng chính xác. Đây là chiến lược tương tự được sử dụng để tra cứu + nội suy cho căn bậc hai.
Matt Knepley

1
Tôi không chắc chắn độ trễ của một bộ phận như vậy, mặc dù. Với tốc độ 4 GHz, thực hiện một chuyến đi khứ hồi đến bảng tra cứu trong N chu kỳ hạn chế nghiêm trọng kích thước tiềm năng của bảng đã nói (ví dụ: bộ đệm L1 đã bị đình trệ ở mức 32K mỗi cái). Đi 3D sẽ giúp tăng điều này (nhưng rất khó khăn khi làm mát). Bạn có biết độ trễ nào có thể đạt được đối với CPU 4GHz / 5GHz hiện đại không?
Matthieu M.

1
Đối với divps / divpd so với mulps / mulpd độ trễ và số lượng thông lượng, xem Phân chia điểm nổi so với phép nhân điểm nổi . Tôi đã lấy dữ liệu từ các bảng hướng dẫn của Agner Fog và định dạng nó thành một bản tóm tắt qua các thông số và độ trễ của div và mul, cho đơn so với gấp đôi và cho các độ rộng vectơ SIMD khác nhau. (Các chip Intel thường có bộ chia SIMD chỉ bằng một nửa chiều rộng của các ALU vectơ khác.)
Peter Cordes
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.