Почему аппаратное ускорение десятичных чисел с плавающей точкой не ускоряется, как двоичные числа с плавающей точкой? - PullRequest
16 голосов
/ 19 сентября 2009

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


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

Ответы [ 12 ]

18 голосов
/ 20 сентября 2009

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

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

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

5 голосов
/ 04 января 2010

В некоторые процессоры 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!)

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

4 голосов
/ 19 сентября 2009

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

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

DAA, AAA, AAD, AAM, DAS, AAS

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

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

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

2 голосов
/ 09 декабря 2010

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

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

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

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

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

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

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

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

2 голосов
/ 29 сентября 2009

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 19 сентября 2009

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

1 голос
/ 19 сентября 2009

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

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

1 голос
/ 19 сентября 2009

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

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

1 голос
/ 19 сентября 2009

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

0 голосов
/ 19 сентября 2009

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

...