Unum (числовой формат) - Unum (number format)

Unums ( универсальные числа ) - это семейство форматов и арифметики, аналогичное плавающей запятой , предложенное Джоном Л. Густафсоном . Они разработаны как альтернатива широко распространенному стандарту IEEE 754 для операций с плавающей запятой, и последняя версия (известная как posits ) может использоваться в качестве замены для программ, которые не зависят от конкретных функций IEEE 754.

Тип I Unum

Первая версия unums, теперь официально известная как Type I unum , была представлена ​​в его книге «Конец ошибки» как надмножество формата с плавающей запятой IEEE-754. Двумя определяющими особенностями формата unum типа I являются:

  • формат хранения переменной ширины и для мантиссы и экспоненты , и
  • U-бит , который определяет , является ли UNUM соответствует точному количеству ( у  = 0), или интервал между последовательным точным unums ( у  = 1). Таким образом, числа покрывают всю расширенную прямую вещественных чисел [−∞, + ∞].

Для выполнения вычислений с форматом Густафсон предлагает использовать интервальную арифметику с парой единиц, которую он называет ubound , обеспечивая гарантию того, что полученный интервал содержит точное решение.

Уильям М. Кахан и Джон Л. Густафсон обсуждали unums на конференции Arith23 .

Тип II Unum

Unums типа II были представлены в конце 2016 года как полная переработка Unums, нарушившая совместимость с IEEE-754.

Тип III Unum (положительный и действительный)

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

Posit

Posits - это аппаратно-дружественная версия unum, в которой устранены трудности, с которыми сталкивался исходный тип I unum из-за его переменного размера. Положения аналогичного размера по сравнению с поплавками предлагают больший динамический диапазон и больше дробных битов для точности. В независимом исследовании Линдстром, Ллойд и Хиттингер из Ливерморской национальной лаборатории Лоуренса подтвердили, что по точности эти поплавки превосходят поплавки. Положения имеют особенно высокую точность в диапазоне, близком к единице, в котором происходит большинство вычислений. Это делает его очень привлекательным для современной тенденции в глубоком обучении минимизировать количество используемых битов. Это потенциально помогает любым приложениям достичь ускорения, позволяя использовать меньшее количество битов (поскольку у него больше дробных битов для точности), тем самым уменьшая пропускную способность сети и памяти, а также требования к мощности, и приближая нас на один шаг к экзафлопности .

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

Положения имеют формат, отличный от формата чисел с плавающей запятой IEEE 754. Они состоят из четырех частей: знака, режима, показателя степени и дроби (также известной как мантисса). Для n- битной позиции режим может иметь длину от 2 до ( n  - 1). Формат режима таков, что это повторение бита одного знака и завершается битом другого знака.

Пример 1:

Пример 1 Пример 2
00000000000000 1 111 0

В примере 1 показан режим с 14 битами с одинаковым знаком (бит 0), завершающимися битом с другим знаком (бит 1). Поскольку имеется 14 битов с одинаковым знаком, продолжительность режима составляет 14.

Пример 2 показывает режим с 3 битами одного знака (бит 1), завершающимися битом другого знака (бит 0). Поскольку имеется 3 бита с одинаковым знаком, продолжительность режима составляет 3.

Биты знака, экспоненты и дроби очень похожи на IEEE 754; однако позиция может опускать один или оба из битов экспоненты и дроби, оставляя позицию, которая состоит только из битов знака и режима. В примере 3 показана максимально возможная длина выполнения режима для 16-битного положения, где бит завершения режима, бит экспоненты и биты дроби превышают длину размера позиции. Пример 4 иллюстрирует наименьшую возможную длину выполнения 1 для 16-битной позиции с одним битом экспоненты (битовое значение = 1) и 12 дробными битами (битовое значение = 100000000001).

Пример 3: Продолжительность режима = 15 Пример 4: Продолжительность режима = 1
0 111111111111111 0 1 0 1 100000000001

Рекомендуемые размеры позиций и соответствующие биты экспоненты и размеры запросов:

Размер позиции (бит) Количество битов экспоненты Размер запроса (бит)
8 0 32
16 1 128
32 2 512
64 3 2048

Примечание . Ожидается, что 32-битного posit будет достаточно для решения почти всех классов приложений.

Quire

Quire - одна из самых полезных функций posit. Это особый тип данных, который дает положению «почти бесконечное» количество битов для накопления скалярных произведений. Он основан на работе Ульриха В. Кулиша и Уилларда Л. Миранкера .

Действительный

Gustafson еще не опубликовал полную спецификацию валидов, но они описаны как режим Unum типа III, ограничивающий результаты в заданном диапазоне.

Реализации

Есть несколько программных и аппаратных реализаций posit от сообщества. Первый полностью параметризованный аппаратный генератор положительной арифметики был предложен в 2018 году.

Реализации Unum были исследованы в Julia . и MATLAB . Также предоставляется версия C ++ с поддержкой любых размеров позиций в сочетании с любым количеством битов экспоненты. Быстрая реализация на C SoftPosit, предоставленная исследовательской группой NGA на основе Berkeley SoftFloat, является последним дополнением к доступным программным реализациям.

Проект

автор

Тип Точность Quire

Служба поддержки?

Скорость Тестирование Примечания
SoftPosit

ЗВЕЗДА

Библиотека C на основе Berkeley SoftFloat

Оболочка C ++ для переопределения операторов Оболочка Python с использованием SWIG SoftPosit

8, 16, 32 опубликованы и завершены; да ~ От 60 до 110 Мбит / с на ядре x86 (Broadwell) 8: Исчерпывающий;

16: Исчерпывающий, кроме FMA, quire 32: Исчерпывающий тест еще не завершен. Нет известных ошибок.

Самая быстрая и полная библиотека C для posit на данный момент. Лицензия с открытым исходным кодом. Предназначен для сравнения подключаемых модулей IEEE float и posit.
posit4.nb

ЗВЕЗДА

Блокнот Mathematica Все да <80 тыс. Кадров / сек. / С Исчерпывающий для низкой точности. Нет известных ошибок. Оригинальное определение и прототип. Наиболее полная среда для сравнения IEEE float и posit. Открытый исходный код (лицензия MIT). Множество примеров использования, включая линейные решатели
posit-javascript

ЗВЕЗДА

Виджет JavaScript Преобразуйте десятичную дробь в 6, 8, 16, 32; сгенерируйте таблицы 2–17 с помощью es 1–4. NA NA; интерактивный виджет Полностью протестировано Генератор и преобразование таблиц
Универсальный

Stillwater Supercomputing, Inc

Библиотека шаблонов C ++

C-библиотека Python-оболочка Golang library

Допустимая произвольная точность posit float (p)

Unum тип 1 (p) Unum тип 2 (p)

Произвольные конфигурации запросов с программируемой емкостью posit <4,0> 1GPOPS

posit <8,0> 130MPOPS posit <16,1> 115MPOPS posit <32,2> 105MPOPS posit <64,3> 50MPOPS posit <128,4> 1MPOPS posit <256,5> 800KPOPS

Полный набор для проверки произвольных позиций

Рандомы для больших конфигураций posit. Использует индукцию для доказательства правильности nbits + 1, ошибок нет

Открытый исходный код. Лицензия MIT

полностью интегрирована с типами C / C ++ и автоматическими преобразованиями. Поддерживает полную математическую библиотеку C ++ (встроенную и преобразование в / из IEEE). Интеграция во время выполнения: MTL4 / MTL5, Eigen, Trilinos, HPR-BLAS. Интеграция приложений: G + SMO, FDBB, FEniCS, ODEintV2. , Интеграция аппаратного ускорителя TVM.ai (Xilinx, Intel, Achronix)

Speedgo

Чунг Шин Йи

Библиотека Python Все Нет ~ 20 Мбит / с Обширный; нет известных ошибок Открытый исходный код (лицензия MIT)
softposit-rkt

Дэвид Тьен

Крепления SoftPosit для Racket Все да Неизвестный Неизвестный
sfpy

Билл Зорн

Привязки SoftPosit для Python Все да ~ 20-45 Мбит / с на ядре Skylake 4,9 ГГц Неизвестный
позицоктава

Диего Коэльо

Реализация октавы Все Нет Неизвестный Ограниченное тестирование; нет известных ошибок Стандартная общественная лицензия GNU
Сигмовидные числа

Исаак Йонемото

Библиотека Юлии Все <32, все ES да Неизвестный Нет известных ошибок (постов).

Ошибки деления (валиды)

Использует стандартную библиотеку шаблонов математики Джулии, может выполнять матричные и тензорные операции, комплексные числа, БПФ, DiffEQ. Поддержка валидов
FastSigmoid

Исаак Йонемото

Юлия и библиотека C / C ++ 8, 16, 32, все ES Нет Неизвестный Известная ошибка в 32-битном умножении Используется LLNL в исследованиях шока
SoftPosit.jl

Милан Клёвер

Библиотека Юлии На основе softposit;

8 бит (es = 0..2) 16 бит (es = 0..2) 24 бит (es = 1..2) 32 бит (es = 2)

да Похожий на

A * STAR "SoftPosit" (Cerlane Leong)

Да:

Posit (8,0), Posit (16,1), Posit (32,2) Другие форматы не имеют полной функциональности

Поддерживает основные функции линейной алгебры в Julia (умножение матриц, решение матриц, разложение Элгена и т. Д.)

Открытый исходный код. Вопросы и предложения на GitHub. Этот проект был разработан в связи с тем, что SigmoidNumbers и FastSigmoid от Isaac Yonemoto в настоящее время не поддерживаются.

PySigmoid

Кен Меркадо

Библиотека Python Все да <20 Мбит / с Неизвестный Открытый исходный код (лицензия MIT). Удобный интерфейс. Пример нейронной сети. Комплексная поддержка функций.
cppPosit

Эмануэле Руффальди

Библиотека C ++ От 4 до 64 (любое значение es); «Версия шаблона от 2 до 63 бит» Нет Неизвестный Несколько основных тестов 4 уровня операций с позициями. Специальная поддержка типов NaN (нестандартная)
bfp: за пределами числа с плавающей запятой

Клеман Герен

Библиотека C ++ Любой Нет Неизвестный Обнаружены ошибки; статус исправлений неизвестен Поддерживает + - × ÷ √ обратный, отрицательный, сравнительный
Verilog.jl

Исаак Йонемото

Юлия и Верилог 8, 16, 32, ES = 0 Нет Неизвестный Всесторонне протестирован на 8-битную версию, никаких известных ошибок нет Предназначен только для приложений глубокого обучения: сложение, вычитание и умножение. Доказательство концепции матричного умножителя было построено, но его точность не соответствует спецификации
Lombiq Арифметика

Lombiq Technologies

C # с Hastlayer для генерации оборудования 8, 16, 32.

(64 бита в процессе)

да 10 Мбит / с

Нажмите здесь, чтобы узнать больше

Частичное Требуются API Microsoft .Net
Deepfloat Джефф Джонсон, Facebook SystemVerilog Любой (параметризованный SystemVerilog) да N / A

(RTL для проектов FPGA / ASIC)

Ограничено Строго не соответствует требованиям posit spec.

Поддерживает +, -, /, *. Реализует как логарифмическую позицию, так и нормальную, "линейную" позицию. Лицензия: CC-BY-NC 4.0 в настоящее время

Токийский Технологический ПЛИС 16, 32, выдвижной Нет "2 ГГц", не переводится в Mpops / s Частичный; известные ошибки округления Еще быть с открытым исходным кодом
PACoGen: Posit Arthmetic Core Generator Маниш Кумар Джайсвал Verilog HDL для арифметики положительных чисел Любая точность.

Возможность генерировать любую комбинацию размера слова (N) и размера экспоненты (ES)

Нет Скорость проектирования зависит от базовой аппаратной платформы (ASIC / FPGA). Исчерпывающие тесты для 8-битных позиций.

Многомиллионные случайные тесты выполняются для 32-битных позиций с различными комбинациями ES

Он поддерживает метод округления до ближайшего.
Виней Саксена, Исследовательский и технологический центр, Роберт Бош, Индия (RTC-IN), и Фархад Мерчант, RWTH Ахенский университет Генератор Verilog для СБИС, ПЛИС Все Нет Подобно числам с плавающей запятой того же размера бит N = 8

- ES = 2 | N = 7,8,9,10,11,12 Селективные (20000 * 65536) комбинаций для - ES = 1 | N = 16

Для использования в коммерческих продуктах. В меру наших знаний.

*** Первая интеграция позиций в RISC-V ***

Позиционирование включено ядро ​​RISC-V

(Суганда Тивари, Нил Гала, Честер Ребейро, В. Камакоти, ИИТ МАДРАС)

Реализация BSV (Bluespec System Verilog) 32-битное положение с (es = 2) и (es = 3) Нет N / A Проверено на SoftPosit для (es = 2) и протестировано с несколькими приложениями для (es = 2) и (es = 3). Нет известных ошибок. Первое полностью готовое ядро ​​RISC-V с возможностью установки. Поддерживает динамическое переключение между (es = 2) и (es = 3).

Больше информации здесь.

Unumjl

REX Computing

Версия FPGA процессора VLIW "Neo" с положительным числовым блоком 32 Нет ~ 1,2 Гбит / с Обширный; нет известных ошибок Никакого деления или квадратного корня. Первый полностью разработанный процессор, заменивший поплавки на позиции.
PNU: Posit Numeric Unit

Calligo Tech

ПЛИС; первое рабочее оборудование posit 32 Заявлено, еще не проверено ~ 0,5 Мбит / с Обширные тесты, но не исчерпывающие. Нет известных ошибок. Однооперационный ускорительный подход; позволяет напрямую выполнять коды C, написанные для чисел с плавающей запятой. + - × проверено; ÷ √ заявлено
IBM-TACC

Цзянью Чен

ПЛИС специального назначения 32 да 16–64 Gpops / s Протестирован только один известный случай Выполняет матричное умножение 128 на 128 (SGEMM) с использованием quire.
Глубокое сито

Рауль Мурильо

Библиотека Python (программное обеспечение) 8, 16, 32 да Неизвестный Неизвестный Фреймворк DNN с использованием posit

SoftPosit

SoftPosit - это программная реализация позиций, основанная на Berkeley SoftFloat. Это позволяет программно сравнивать позиции и числа с плавающей запятой. В настоящее время он поддерживает

  • Добавлять
  • Вычесть
  • Умножить
  • Делить
  • Слил-умножить-сложить
  • Плавлен-точечный продукт (с quire)
  • Квадратный корень
  • Преобразование posit в целое число со знаком и без знака
  • Преобразование знакового и беззнакового целого числа в положительное
  • Преобразование позиции в другой размер позиции
  • Меньше, равно, меньше, чем равно сравнение
  • Округлить до ближайшего целого числа

Вспомогательные функции

  • преобразовать двойное в положительное
  • преобразовать posit в double
  • привести беззнаковое целое число к положению

для 16-битных позиций с одним битом экспоненты и 8-битных позиций с нулевым битом экспоненты. Поддержка 32-битных позиций и гибкого типа (2-32 бита с двумя битами экспоненты) ожидает проверки правильности. В настоящее время поддерживает системы x86_64. Он был протестирован на GNU gcc (SUSE Linux) 4.8.5 Apple LLVM версии 9.1.0 (clang-902.0.39.2).

Примеры :

Добавить с posit8_t

#include "softposit.h"

int main (int argc, char *argv[]){

    posit8_t pA, pB, pZ;
    pA = castP8(0xF2);
    pB = castP8(0x23);

    pZ = p8_add(pA, pB);

    //To check answer by converting it to double
    double dZ = convertP8ToDouble(pZ);
    printf("dZ: %.15f\n", dZ);

    //To print result in binary (warning: non-portable code)
    uint8_t uiZ = castUI8(pZ);
    printBinary((uint64_t*)&uiZ, 8);

    return 0;
}

Слитное скалярное произведение с quire16_t

//Convert double to posit
posit16_t pA = convertDoubleToP16(1.02783203125 );
posit16_t pB = convertDoubleToP16(0.987060546875);
posit16_t pC = convertDoubleToP16(0.4998779296875);
posit16_t pD = convertDoubleToP16(0.8797607421875);

quire16_t qZ;

//Set quire to 0
qZ = q16_clr(qZ);

//accumulate products without roundings
qZ = q16_fdp_add(qZ, pA, pB);
qZ = q16_fdp_add(qZ, pC, pD);

//Convert back to posit
posit16_t pZ = q16_to_p16(qZ);

//To check answer
double dZ = convertP16ToDouble(pZ);

Критика

Уильям М. Кахан, главный разработчик IEEE 754-1985, критикует униумы типа I по следующим причинам (некоторые из них рассматриваются в стандартах типа II и типа III):

  • Описание unums обходных шагов с использованием исчисления для решения физических задач.
  • Unums может быть дорогостоящим с точки зрения времени и энергопотребления.
  • Каждое вычисление в пространстве unum может изменить длину структуры в битах. Это требует либо распаковки их в пространство фиксированного размера, либо выделения, освобождения и сборки мусора во время операций unum, аналогично проблемам при работе с записями переменной длины в массовом хранилище.
  • Unums предоставляет только два вида числовых исключений: тихое и сигнальное NaN (Not-a-Number).
  • Вычисление Unum может дать слишком слабые границы от выбора алгебраически правильного, но численно нестабильного алгоритма.
  • Затраты и преимущества unum по сравнению с плавающей запятой с короткой точностью для задач, требующих низкой точности, не очевидны.
  • Решение дифференциальных уравнений и вычисление интегралов с помощью unums гарантируют правильные ответы, но могут быть не такими быстрыми, как обычно работающие методы.

Смотрите также

использованная литература

дальнейшее чтение

внешние ссылки