LUT против деления Ньютона-Рафсона для 32-битной плавающей запятой IEEE-754 - PullRequest
3 голосов
/ 02 апреля 2012

Мне было интересно, каковы компромиссы при реализации 32-битного деления с плавающей запятой IEEE-754: использование LUT по сравнению с методом Ньютона-Рафсона?

Когда я говорю о компромиссах, я имею в виду размер памяти, количество команд и т. Д.

У меня небольшая память (130 слов (каждый 16-разрядный)).Я храню верхние 12-битные мантиссы (включая скрытый бит) в одной ячейке памяти, а младшие 12-битные мантиссы - в другой.

В настоящее время я использую деление Ньютона-Рафсона, но я думаю о том, каковы компромиссы, если я изменил свой метод.Вот ссылка на мой алгоритм: Метод Ньютона для нахождения обратной величины числа с плавающей запятой для деления

Спасибо и, пожалуйста, объясните свои рассуждения.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2012

Компромисс довольно прост.LUT использует дополнительную память в надежде уменьшить количество команд, достаточное для экономии времени.Будет ли он эффективным, во многом будет зависеть от деталей процессора - в частности, от кеширования.

Для Ньютона-Рафсона вы меняете X / Y на X * (1 / Y) и используете свою итерацию, чтобы найти 1 / Y.По крайней мере, по моему опыту, если вам нужна полная точность, она редко полезна - ее основная сила в том, чтобы вы могли быстрее находить (скажем) 16-битную точность.

Обычный метод деления - побитовый метод .Хотя этот конкретный ответ имеет дело с целыми числами, для плавающей запятой вы делаете по существу то же самое, за исключением того, что вместе с ним вычитаете экспоненты.Число с плавающей запятой в основном равно A * 2 N , где A - это значение, а N - экспоненциальная часть числа.Итак, вы берете два числа A * 2 N / B * 2 M и выполняете деление как A / B * 2 NM , с A иВ этом случае B рассматривается как (по существу) целое число.Единственная реальная разница в том, что с плавающей запятой вы обычно хотите округлять, а не усекать результат.По сути, это просто означает выполнение деления (как минимум) одного дополнительного бита точности, а затем округление в большую сторону, если этот дополнительный бит равен единице.

Наиболее распространенный метод с использованием справочных таблиц - это SRT-деление.Чаще всего это делается аппаратно, так что я бы, вероятно, использовал Google для чего-то вроде «Verilog SRT» или «VHDL SRT».Рендеринг в C ++ не должен быть очень сложным.Если метод, который я описал в связанном ответе, производит по битам на итерацию, это можно записать для выполнения 2, 4 и т. Д. Если память используется, размер таблицы увеличивается в квадрате по сравнению с количеством битов, создаваемых за одну итерацию, поэтому вы редкоувидеть гораздо больше 4 на практике.

3 голосов
/ 02 апреля 2012

Каждый шаг Ньютона-Рафсона примерно удваивает количество разрядов точности, поэтому, если вы можете рассчитать количество разрядов точности, которое вы ожидаете от LUT определенного размера, вы сможете определить, сколько шагов NR вам нужно достичь желаемой точности. Cray-1 использовал NR как заключительную стадию своего взаимного расчета. В поисках этого я нашел довольно подробную статью о таких вещах: Точное, высокоскоростное выполнение деления по взаимной аппроксимации из 9-го Симпозиума IEEE по компьютерной арифметике (6-8 сентября 1989 г.).

...