LINUX.ORG.RU
ФорумTalks

как в процессорах чаще всего реализована команда деления?


1

1

Чтобы разгрузить мозг после трудного понедельника, вот вам задачка для специалистов по всему: Как бы вы реализовали операцию целочисленного деления в самодельном процессоре? Как сэмулировали бы эту операцию на процессоре не поддерживаемом её? Какие бы шаги предприняли для оптимизации этой операции?

★★★
Ответ на: комментарий от true_admin

Я знаю как сделать деление на 2!

На n! было бы интереснее.

Sadler ★★★
()
Ответ на: комментарий от firestarter

всё же лучше чем наблюдать за битвой Носки vs. Сандали

mm3 ★★★
() автор топика
Ответ на: комментарий от quowah

ADC, если потребуется 64-х битная точность, сколько циклов потребует для оцифровки одного семпла? :)

qrck ★★
()

чтобы разгрузить мозг

задачка

Поздравляю, вы только что реализовали операцию деления на ноль!

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

«я бы взял все эти результаты от деления первых 1е1024 чисел друг на друга, загнал бы в файлик, а потом бы быстро одним сисколлом доставал»

cdshines ★★★★★
()

Как там говорил Шариков: «Взять всё и поделить!» ©

daemonpnz ★★★★★
()
Ответ на: комментарий от cdshines

«я бы взял все эти результаты от деления первых 1е1024 чисел друг на друга, загнал бы в файлик, а потом бы быстро одним сисколлом доставал»

Так а вполне себе годная идея. ROM c таблицей результатов деления. Быстро, дёшево и сердито.

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Проблема только в том, что деление — двухместная операция.

buddhist ★★★★★
()
Ответ на: комментарий от true_admin

Я знаю как сделать деление на 2!

А я на 4, 8, 16, 32, етц. :)

andreyu ★★★★★
()
Ответ на: комментарий от KennyMinigun

Так а вполне себе годная идея. ROM c таблицей результатов деления. Быстро, дёшево и сердито.

Быстрая? Да чтение (и запись) из памяти далеко не быстрая оперция. А если чтение будет нелинейным (а в данном случае оно таковым и будет), то и кеш не поможет.

andreyu ★★★★★
()
Последнее исправление: andreyu (всего исправлений: 1)
Ответ на: комментарий от andreyu

Так ROM же, прямо в чипе. Здоровенный, конечно, нужен.
Можно ещё забить в ROM таблицу только для первых k×k и считать в 2^k-ичной системе счисления.

Q3164
()

if, сдвиг, вычитание

yu-boot ★★★★★
()

Для деления в конечном поле достаточно хранить таблицу обратных элементов.

Deleted
()

Как бы вы реализовали операцию целочисленного деления в самодельном процессоре?

есть два способа:

1. интерполяция многочленом какой-нить степени небольшого участка, и пересчёт всего остального. Удобно в FP, ибо там число и так всегда ½≤x<1.

2. дихотомия. Это тот же самый способ «в столбик», как в школе, но при основании системы счисления 2 оно вырождается в простую дихотомию. Годно для целых чисел.

Какие бы шаги предприняли для оптимизации этой операции?

ЕМНИП дихотомия без восстановления остатка самая быстрая. А оптимизировать можно сложения, путём применения аппаратного сумматора.

drBatty ★★
()
Ответ на: комментарий от true_admin

Я знаю как сделать деление на 2!

молодец. Для двоичной системы этого вполне достаточно.

drBatty ★★
()
Ответ на: комментарий от KennyMinigun

Так а вполне себе годная идея. ROM c таблицей результатов деления. Быстро, дёшево и сердито.

во первых — медленно.

во вторых — дорого

в третьих — печально, что ты так плохо учишься в школе.

drBatty ★★
()
Ответ на: комментарий от Q3164

Можно ещё забить в ROM таблицу только для первых k×k и считать в 2^k-ичной системе счисления.

для прикола попробуй написать программу, которая делит в четверичной СС.

drBatty ★★
()
Ответ на: комментарий от quowah

voltage divider

с этого места поподробнее: покажите мне такой делитель, который делит одно напряжение, на ДРУГОЕ НАПРЯЖЕНИЕ.

drBatty ★★
()
Ответ на: комментарий от drBatty

Про деление я ничего не знаю (и на вопрос из ОП-поста «Как бы...» ответил бы «Софтово»), а умножение можно так сделать, хотя я и не знаю, каким способом будет быстрее.

Q3164
()
Ответ на: комментарий от drBatty

Ога. Подпрограммой.

В x86 ВНЕЗАПНО тоже нет, и никогда не было аппаратного делителя. Не нужен.

Ты в своём репертуаре.

i-rinat ★★★★★
()
Ответ на: комментарий от andreyu

Но почему? Вроде везде сказано, что ROM медленне, но почему, я понять не могу, вроде же в нём от одного конца до другого совсем немного элементов.

Q3164
()

для floatов магия целочисленная хитрая а потом итерациями добирают точность

ckotinko ☆☆☆
()
Ответ на: комментарий от Deleted

Только, к сожалению, в процессоре основной тип данных — не элемент конечного поля.

Q3164
()
Ответ на: комментарий от Q3164

Но почему? Вроде везде сказано, что ROM медленне, но почему, я понять не могу, вроде же в нём от одного конца до другого совсем немного элементов.

В силу архитектуры любой памяти, чтение из нее очень медленное по сравнению со скоростью вычисления математики в проце.

andreyu ★★★★★
()
Ответ на: комментарий от Q3164

Когда то давно, на ZX-Spectrum было правильнее заранее расчитать таблицу синусов, чем считать их в рилтайме. Поскольку работа с памятью не была узким местом (относительно скорости работы процессора).

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Когда то давно, на ZX-Spectrum было правильнее заранее расчитать таблицу синусов, чем считать их в рилтайме.

Когда-то давно, на 8086 было правильнее заранее рассчитать таблицу умножения на 80 (такой код в Norton Commander есть, если не ошибаюсь), чем использовать умножение. Умножение! А ты о синусах.

i-rinat ★★★★★
()

The Goldschmidt method is used in AMD Athlon CPUs and later models

redgremlin ★★★★★
()
Ответ на: комментарий от i-rinat

Когда-то давно, на 8086 было правильнее заранее рассчитать таблицу умножения на 80 (такой код в Norton Commander есть, если не ошибаюсь), чем использовать умножение. Умножение! А ты о синусах.

Но это не отменяет того факта, что таблицу синусов на speccy, было выгоднее расчитать предварительно. Верно? :)

andreyu ★★★★★
()
Ответ на: комментарий от Q3164

а умножение можно так сделать, хотя я и не знаю, каким способом будет быстрее.

умножители ещё в 70х годах прошлого века делали 2х, и даже 4х битными. Естественно они намного быстрее однобитного («однобитный умножитель» — это простой сумматор удвоенного размера). Например двухбитный умножитель одновременно (не)складывает два числа с частичной суммой.

Но вот двухбитных делителей, AFAIK не делают до сих пор.

drBatty ★★
()
Ответ на: комментарий от i-rinat

В x86 ВНЕЗАПНО тоже нет, и никогда не было аппаратного делителя. Не нужен.

Ты в своём репертуаре.

ну дык так оно и есть: деление является очень редкой операцией, и потому все силы всегда бросают на сложение/умножение. А деление реализуют софтово, через сверхбыстрое сложение/умножение. Это проще, и намного дешевле аппаратного делителя.

drBatty ★★
()
Ответ на: комментарий от Q3164

Даже если память такая https://ece.uwaterloo.ca/~cgebotys/NEW/romdec.gif ?

если такая — всё отлично. Но представь себе матрицу 30000×30000 китайцев (миллиард). Скорость работы такой матрицы равна скорости работы одного китайца, ибо в каждый момент мы выбираем только одного из матрицы. А вот кормить тебе придётся весь миллиард. Сейчас в процессоре в умножителе тоже 100500 транзисторов, и они тоже составляют матрицу, например умножитель 32x32 умножает за один такт два числа из 32х бит, и имеет в своём составе 1024 однобитных сумматоров. Но работают они ВСЕ сразу, а не по одному. Единственное, что сейчас ограничивает число транзисторов — TDP, потому вопрос кормления стоит ребром.

drBatty ★★
()
Ответ на: комментарий от i-rinat

Когда-то давно, на 8086 было правильнее заранее рассчитать таблицу умножения на 80 (такой код в Norton Commander есть, если не ошибаюсь), чем использовать умножение. Умножение!

умножение на константу — частный случай. И да, 80 == 2⁴+2²+2⁰, т.е. всего три сложения/сдвига. Что-то я сильно сомневаюсь, что выборка из памяти будет быстрее.

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.