Чому поділ настільки складніший, ніж інші арифметичні операції?


39

Нещодавно я стикався з випадком, коли мені потрібна була ціла операція ділення на чіпі, якому не вистачало одного (ARM Cortex-A8). Намагаючись досліджувати, чому це повинно бути, я з’ясував, що загалом поділ займає набагато більше циклів, ніж додавання, віднімання чи множення на майже будь-якій цілій (або фіксованій) архітектурі. Чому це так? Хіба він не представлений з двошаровою ІЛИ АБО логікою, як і все інше?

Відповіді:


34

Ділення - це ітеративний алгоритм, коли результат з коефіцієнта повинен бути зміщений до залишку за допомогою евклідової міри, див. 2 ; тоді як множення може бути зведене до (фіксованого) ряду трюкових маніпуляцій.


2
Бувало, що і множення, і ділення були повільними операціями. У наш час множення дещо швидше (але трохи повільніше, ніж додавання / віднімання), але ділення все-таки повільніше, ніж інші. Я вважаю, що Ньютон-Рафсон все ще використовується всередині більшості для зворотно-поступальної кількості.
JM

12
(Поза темою: "Зворотні операції, як правило, важкі. Подивіться на інтеграцію проти диференціації." - залежить від того, чи те, що ви робите, символічне чи числове. Диференціація символічно проста, але чисельно важка; інтеграція символічно складна, але чисельна легко.)
JM

1
Гаразд, я вигадаю, кажу, що кубатура - це інша банка глистів; але принаймні в одновимірному випадку квадратура легша, ніж диференціація.
JM

1
У будь-якому випадку, інверси завжди бувають попарно. Чому б ви назвали одну "операцією", а другу - "зворотною"?
Девід Кетчесон

2
Ні ітерація, ні зворотна не ускладнює. Жорсткість поділу походить від того, що вам потрібно перенести результат з коефіцієнта на решту за допомогою евклідової міри. Дивіться теорему алгоритму поділу .

20

Незважаючи на те, що всі поточні процесори використовують ітеративний підхід, як підказує aterrel , було проведено певну роботу над неітераційними підходами. Змінна точність поділу з плаваючою комою та квадратного кореня розповідає про неітераційну реалізацію поділу з плаваючою комою та квадратний корінь у FPGA , використовуючи таблиці пошуку та розширення рядів Тейлора.

Я підозрюю, що ті ж методики дозволяють звести ці операції до одного циклу (пропускна здатність, якщо не затримка), але вам, ймовірно, знадобляться величезні таблиці пошуку, і, таким чином, великі площі кремнієвої нерухомості для цього .

Чому це було б нездійсненно?

При розробці процесорів можна зробити багато компромісів. Функціональність, складність (кількість транзисторів), швидкість та енергоспоживання взаємопов'язані, і рішення, прийняті під час проектування, можуть зробити величезний вплив на продуктивність.

Сучасний процесор, ймовірно, міг би мати головний блок з плаваючою комою, який виділяє достатню кількість транзисторів на кремнію для виконання поділу з плаваючою комою в одному циклі , але навряд чи це буде ефективним використанням цих транзисторів.

Десятиліття тому плаваюча точка багаторазово зробила цей перехід від ітераційного до неітераційного. У цей час одночасний цикл множення і навіть множення-накопичення є звичним явищем навіть у мобільних процесорах.

До того, як воно стало ефективним використанням бюджету транзисторів, його множення, як і ділення, часто виконували ітераційним методом. Тоді спеціальні процесори DSP могли б присвятити більшу частину свого кремнію одному блоку швидкого множення накопичення (MAC) . Процесор Core2duo має плаваючу крапку затримку з 3 (значення виходить із циклу трубопроводу 3 після того, як він увійшов), але може мати 3 мультиплікації під час польоту одразу, що призводить до пропускної спроможності одного циклу, тим часом що блок SSE2 може викачайте кілька множин FP за один цикл.

Замість того, щоб присвячувати величезні площі кремнію для однорозрядного подільного блоку, сучасні процесори мають кілька одиниць, кожен з яких може виконувати операції паралельно, але оптимізовані для власних конкретних ситуацій. Насправді, як тільки ви взяти до уваги SIMD інструкцій , таких як SSE або CPU інтегрованої графіки в Sandy Bridge або більш пізньої версії процесора, може бути багато таких чисел з плаваючою комою ділять блоки на CPU.

Якби загальний поділ з плаваючою комою був важливішим для сучасних процесорів, тоді, можливо, буде доцільно виділити достатню кількість кремнію, щоб зробити його одним циклом, проте більшість виробників чіпів вирішили, що вони можуть краще використовувати цей кремній, використовуючи ці ворота для інших речей . Таким чином, одна операція проходить повільніше, але в цілому (для типових сценаріїв використання) процесор швидший і / або споживає менше енергії.


Наскільки мені відомо, жодна фішка не має одночасних затримок поділу для плаваючої точки. Наприклад, таблиці інструкцій Agner Fog для процесорів Intel, AMD та VIA перераховують DIVPS (SSE-упаковка з плаваючою комою) як 10-14 циклів. Я не можу знайти будь-яке обладнання з інструкціями про поділ на один цикл, але я хотів би виявитись неправильним. Наскільки я не можу сказати, це не часто.
Білл Барт

@Bill - Спасибі, ти маєш рацію. Я впевнений, що раніше бачив операції ділення одноциклу на мікросхемах DSP, тому припускав, що це дозволило б отримати шлях до робочого столу так само, як це зробило одноциклічне множення, але я зараз не можу знайти жодних посилань. Я оновив свою відповідь і додав релевантну інформацію про неітераційні методи, які, можливо, дозволять це надалі. Дивовижно думати, що поділ не є більш ефективним за цикл зараз, ніж назад, коли я використовував комп’ютери.
Марк Бут

1
Я думаю, що DSP роблять це, обмежуючи діапазон, у якому вони є точними. Це та ж стратегія, що використовується для пошуку + інтерполяції для квадратного кореня.
Метт Кнеплі

1
Я не впевнений, якою буде затримка такого поділу. При частоті 4 ГГц перехід до оглядової таблиці протягом N циклів сильно обмежує потенційний розмір згаданої таблиці (наприклад, кеші L1 застоюються на рівні 32 КК кожен). Увімкнення 3D допоможе збільшити це (але викликає загрозу охолодження). Чи маєте ви уявлення, якої затримки можна досягти для сучасних процесорів 4 ГГц / 5 ГГц?
Матьє М.

1
Про числа divps / divpd vs mulps / mulpd затримки та пропускну здатність див. У розділі Розділення з плаваючою комою на множення з плаваючою комою . Я взяв дані з таблиць інструкцій Agner Fog і відформатував їх у підсумок через ряд пробігу та затримки ділів та мулів, для одинарних проти подвійних та для різної ширини вектора SIMD. (У мікросхем Intel, як правило, є дільник SIMD, який становить лише половину ширини інших векторних АЛУ.)
Пітер Кордес,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.