Почему десятичные числа с плавающей запятой не ускоряются аппаратно, как двоичные числа с плавающей запятой?

StackOverflow https://stackoverflow.com/questions/1447215

  •  22-07-2019
  •  | 
  •  

Вопрос

Стоит ли реализовывать это на аппаратном уровне?Если да, то почему?Если нет, то почему бы и нет?


Извините, я думал, вам ясно, что я говорю о десятичных рациональных числах!Хорошо, что-то вроде Порядковый номер++ для C++, десятичная дробь для .NET...Надеюсь, теперь это понятно :)

Это было полезно?

Решение

Последняя редакция IEEE 754:2008 стандарт действительно определяет аппаратные десятичные числа с плавающей запятой, используя представления, показанные в программном обеспечении, упомянутом в вопросе.Предыдущая версия стандарта (IEEE 754:1985) не предоставлял десятичных чисел с плавающей запятой.Большинство современных аппаратных средств реализует стандарт 1985 года, а не стандарт 2008 года, но компьютеры IBM iSeries используют Мощность 6 чипсы иметь такую поддержку, и то же самое делают z10 мэйнфреймы.

Усилия по стандартизации десятичной системы счисления с плавающей запятой возглавил Майк Коулишоу (Mike Cowlishaw) из IBM UK, который обладает веб-сайт полно полезной информации (включая программное обеспечение, указанное в вопросе).Вполне вероятно, что со временем другие производители оборудования также введут десятичные единицы измерения с плавающей запятой на своих чипах, но я не слышал указаний относительно того, когда (и добавит ли) ли это вообще Intel может добавить их.Intel действительно оптимизировала библиотеки программного обеспечения за это.

Тот Самый C комитет по стандартам хочет добавить поддержку десятичной системы с плавающей запятой, и эта работа называется TR 24732.

Другие советы

В некоторые процессоры IBM включено выделенное десятичное оборудование (десятичное число с плавающей запятой | DFP-модуль).

Вклад ответил 18 сентября в 23:43 Даниэль Приден

Основная причина в том, что DFP-блокам требуется больше транзисторов в чипе, чем BFP-блокам. Причиной является код BCD для вычисления десятичных чисел в двоичной среде. IEEE754-2008 имеет несколько способов минимизировать перегрузку. Похоже, что метод DPD hxxp: //en.wikipedia.org/wiki/Densely_packed_decimal более эффективен по сравнению с методом BID hxxp: //en.wikipedia.org/wiki/Binary_Integer_Decimal.

Обычно вам нужно 4 бита для покрытия десятичного диапазона от 0 до 9. Биты с 10 по 15 недопустимы, но все еще возможны с BCD. Поэтому DPD сжимает 3 * 4 = 12 бит в 10 бит, чтобы охватить диапазон от 000 до 999 с 1024 (10 ^ 2) возможностями.

В общем, BFP работает быстрее, чем DFP. И BFP нужно меньше места на чипе, чем DFP.

На вопрос, почему IBM внедрила модуль DFP, достаточно просто ответить: Они строят серверы для финансового рынка. Если данные представляют деньги, они должны быть надежными.

При использовании десятичной арифметики с аппаратным ускорением некоторые ошибки не появляются, как в двоичном. 1/5 = 0,2 = > 0.0110011001100110011001100110 ... в двоичном коде, чтобы избежать повторяющихся дробей.

И функция round () в Excel больше не будет полезна: D (- > function = 1 * (0,5-0,4-0,1) wtf!)

надеюсь, что немного объясню ваш вопрос!

Есть (немного) ускорение десятичной строки, но ...

Это хороший вопрос. Моей первой реакцией было " макрооперации всегда не могли доказать " , но, подумав об этом, то, о чем вы говорите, будет намного быстрее, если будет реализовано в функциональном модуле. Я полагаю, все сводится к тому, достаточно ли важны эти операции. Существует довольно плачевная история макроопераций и специальных инструкций для конкретных приложений, и, в частности, более ранние попытки десятичных финансовых форматов в настоящее время просто унаследованы. Например, я сомневаюсь, что они часто используются, но на каждом ПК есть коды операций Intel BCD , которые состоят из

DAA, AAA, AAD, AAM, DAS, AAS

Давным-давно десятичные строковые инструкции были распространены на высокопроизводительном оборудовании. Не ясно, что они когда-либо имели большое значение для сравнения. Программы тратят много времени на тестирование, ветвление, перемещение и вычисление адресов. Обычно не имеет смысла помещать макрооперации в архитектуру набора команд, потому что в целом дела идут быстрее, если вы предоставляете процессору наименьшее количество фундаментальных действий, поэтому он может направить все свои ресурсы на их выполнение в виде как можно быстрее.

В наши дни даже не все бинарные операции на самом деле находятся в реальном ISA. Процессор преобразует устаревший ISA в микрооперации во время выполнения. Это все часть быстрого продвижения за счет специализации на основных операциях. Пока что оставшиеся транзисторы, похоже, ожидают некоторой графики и 3D-работы, то есть MMX, SSE, 3DNow!

Я полагаю, что дизайн чистого листа может сделать что-то радикальное и объединить современные (HW) научные и (SW) десятичные форматы с плавающей запятой, но не затаить дыхание.

Нет, они очень неэффективны в памяти. И расчеты также выполняются на оборудовании, которое нелегко реализовать (конечно, это можно сделать, но это также может занять много времени). Другим недостатком десятичного формата является то, что он не используется в простом виде, прежде чем исследование показало, что двоичные числа были более точными, формат был популярен какое-то время. Но теперь программисты знают лучше. Десятичный формат не эффективен и с большими потерями. Кроме того, дополнительные аппаратные представления требуют дополнительных наборов команд, которые могут привести к более сложному коду.

Аппаратное обеспечение, которое вы хотите, было довольно распространенным.

Старые процессоры имели аппаратную арифметику BCD (десятичный код с двоичным кодом). (Маленькие чипы Intel имели небольшую поддержку, как отмечалось в предыдущих постерах)

Аппаратная BCD была очень хороша для ускорения FORTRAN, который использовал 80-битную BCD для чисел.

Научные вычисления занимали значительную долю мирового рынка.

Поскольку все (условно говоря) получили домашний ПК с Windows, рынок стал крошечным в процентах. Так что никто не делает это больше.

Поскольку вы не против иметь 64-битные двойные числа (двоичные числа с плавающей запятой) для большинства вещей, это в основном работает.

Если вы используете 128-битные двоичные числа с плавающей запятой на современных аппаратных векторных модулях, это не так уж плохо. Все еще менее точный, чем 80-битный BCD, но вы получите это.

На более ранней работе коллега, ранее работавший в JPL, был удивлен, что мы все еще использовали FORTRAN. " Мы перешли на C и C ++, как он нам сказал. " Я спросил его, как они решили проблему отсутствия точности. Они не заметили. (У них также не такая же точность приземления космического зонда, как раньше. Но любой может пропустить планету.)

Итак, в основном 128-битные двойники в векторной единице более приемлемы и широко доступны.

Мои двадцать центов. Пожалуйста, не представляйте его как число с плавающей точкой:)

Стандарт десятичного числа с плавающей запятой (IEEE 754-2008) уже реализован на аппаратном уровне двумя компаниями; серверы IBM на базе POWER 6/7 и SilMinds карта ускорения на основе SilAx PCIe.

SilMinds опубликовал тематическое исследование о преобразовании десятичного арифметического выполнения в его HW решения . Представлено большое увеличение времени и снижение энергопотребления.

Более того, несколько публикаций "Michael J. Schulte" и другие показывают очень положительные результаты тестов, а также некоторые сравнения форматов DPD и BID (оба определены в стандарте IEEE 754-2008)

Вы можете найти PDF-файлы по адресу:

<Ол>
  • Анализ производительности десятичных библиотек с плавающей запятой и его влияние на десятичные аппаратные и программные решения

  • Обзор конструкций оборудования для десятичной арифметики

  • Улучшение энергии и задержки с помощью десятичных единиц с плавающей запятой

  • Этих трех документов должно быть более чем достаточно для ваших вопросов!

    Я полагаю, что не существует ресурсоемких приложений десятичных чисел. С другой стороны, числа с плавающей запятой широко используются в инженерных приложениях, которые должны обрабатывать огромные объемы данных и не требовать точных результатов, просто нужно оставаться в пределах желаемой точности.

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

    Любой, кому нужна максимальная скорость, собирается вручную настроить их реализацию (например, изменение делителя в соответствии с конкретным использованием, алгебраическое объединение / переупорядочение операций, умелое использование SIMD-тасов ...). Простое кодирование наиболее распространенных функций в аппаратный ISA, несомненно, никогда не удовлетворит их - по всей вероятности, это не поможет вообще.

    Простой ответ заключается в том, что компьютеры - это двоичные машины. У них нет десяти пальцев, у них есть два. Таким образом, сборка аппаратного обеспечения для двоичных чисел значительно быстрее, проще и эффективнее, чем сборка аппаратного обеспечения для десятичных чисел.

    Кстати, десятичные и двоичные числа - это числовые базы, а фиксированная и плавающая - это механизмы для приближения рациональных чисел. Они полностью ортогональны: у вас могут быть десятичные числа с плавающей запятой (System.ececimal .NET реализован таким образом) и двоичные числа с фиксированной запятой (обычные целые числа - только частный случай этого).

    Математика с плавающей точкой по сути является попыткой реализовать десятичные дроби в аппаратном обеспечении. Это хлопотно, поэтому типы Decimal создаются частично в программном обеспечении. Хороший вопрос, почему процессоры не поддерживают больше типов, но я полагаю, что это восходит к процессорам CISC против RISC - RISC выиграл битву за производительность, поэтому я думаю, что в наши дни они стараются упростить ситуацию.

    Современные компьютеры обычно общего назначения. Арифметика с плавающей точкой имеет очень общее назначение, в то время как десятичное имеет гораздо более конкретное назначение. Я думаю, что это одна из причин.

    Вы имеете в виду типичные числовые целочисленные типы "int", "long", "short" (так далее.)? Потому что операции над этими типами определенно реализованы на аппаратном уровне. Если вы говорите о больших числах произвольной точности («BigNums» и «Десятичные числа» и т. Д.), Вероятно, это комбинация редкости операций с использованием этих типов данных и сложности построения аппаратного обеспечения для работы с произвольно большими форматами данных. .

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top