Unums ( универсальные числа [1] ) — это семейство числовых форматов и арифметики для реализации действительных чисел на компьютере, предложенное Джоном Л. Густафсоном в 2015 году . [2] Они разработаны как альтернатива повсеместному стандарту с плавающей точкой IEEE 754. Последняя версия известна как posit . [3]
Первая версия unums, официально известная как Type I unum, была представлена в книге Густафсона «Конец ошибок» как надмножество формата с плавающей точкой IEEE-754. [2] Определяющими особенностями формата Type I unum являются:
Для вычислений в этом формате Густафсон предложил использовать интервальную арифметику с парой чисел unum, которую он назвал ubound , обеспечивая гарантию того, что полученный интервал содержит точное решение.
Уильям М. Кахан и Густафсон обсуждали unums на конференции Arith23 . [4] [5] [6] [7]
Unums типа II были введены в 2016 году [8] как переработанный вариант Unums, который нарушил совместимость с IEEE-754.
Этот раздел нуждается в расширении . Вы можете помочь, дополнив его. ( Июнь 2021 ) |
В феврале 2017 года Густафсон официально представил unums типа III (posit) для фиксированных значений с плавающей точкой и допустимых значений для интервальной арифметики . [3] В марте 2022 года стандарт был ратифицирован и опубликован рабочей группой Posit. [9]
Posits [3] [10] [11] — это аппаратно-дружественная версия unum, в которой решены трудности, с которыми сталкивался исходный тип I unum из-за его переменного размера. По сравнению с float IEEE 754 аналогичного размера, posit предлагают больший динамический диапазон и больше дробных бит для значений с величиной около 1 (но меньше дробных бит для очень больших или очень малых значений), и Густафсон утверждает, что они обеспечивают лучшую точность. [12] [13] Исследования [14] [15] подтверждают, что для некоторых приложений posit с quire превосходят float по точности. Posit имеют превосходную точность в диапазоне около единицы, где происходит большинство вычислений. Это делает его очень привлекательным для текущей тенденции в глубоком обучении, чтобы минимизировать количество используемых бит. Это потенциально помогает любому приложению ускориться, позволяя использовать меньше бит (так как у него больше дробных бит для точности), уменьшая пропускную способность сети и памяти, а также требования к питанию.
Формат n -битного posit обозначается меткой «posit», за которой следуют десятичные цифры n (например, 16-битный формат posit — «posit16») и состоит из четырех последовательных полей:
Поле режима использует унарное кодирование k одинаковых битов, за которыми следует бит противоположного значения, если доступны какие-либо оставшиеся биты, для представления беззнакового целого числа r , которое равно − k, если первый бит равен 0, или k − 1, если первый бит равен 1. Поля знака, экспоненты и дроби аналогичны полям знака, экспоненты и мантиссы IEEE 754 (соответственно), за исключением того, что поля положительной экспоненты и дроби могут отсутствовать или быть усеченными и неявно расширенными нулями — отсутствующая экспонента рассматривается как 00
2 (представляющая 0), однобитовая экспонента E 1 рассматривается как 2 (представляющая целое число 0, если E 1 равно 0, или 2, если E 1 равно 1), а отсутствующая дробь рассматривается как 0.E10
Две кодировки, в которых все незнаковые биты равны 0, имеют специальные интерпретации:
NaR
(«недействительное»).sign
возвращает 0)В противном случае положительное значение равно , в котором r масштабируется по степеням 16, e масштабируется по степеням 2, f равномерно распределяет значения между соседними комбинациями ( r , e ), а s корректирует знак симметрично относительно 0.
тип (полож. n ) | Двоичный | Ценить | Примечания |
---|---|---|---|
Любой | 1 0… | NaR | все, что математически не определяется как уникальное действительное число [9] |
Любой | 0 0… | 0 | |
Любой | 0 10… | 1 | |
Любой | 1 10… | −1 | |
Любой | 0 01 11 0… | 0,5 | |
Любой | 0 0…1 | наименьшее положительное значение | |
Любой | 0 1… | наибольшее положительное значение | |
posit8 | 0 0000001 | наименьшее положительное значение | |
posit8 | 0 1111111 | наибольшее положительное значение | |
posit16 | 0 000000000000001 | наименьшее положительное значение | |
posit16 | 0 111111111111111 | наибольшее положительное значение | |
posit32 | 0 0000000000000000000000000000001 | наименьшее положительное значение | |
posit32 | 0 1111111111111111111111111111111 | наибольшее положительное значение |
Примечание : ожидается, что 32-битного posit будет достаточно для решения практически всех классов приложений [ необходима ссылка ] .
Для каждого типа posit n точности стандарт определяет соответствующий тип "quire" quire n точности , используемый для накопления точных сумм произведений этих posit без округления или переполнения в скалярных произведениях для векторов до 2 31 или более элементов (точный предел равен ). Формат quire представляет собой целое число со знаком в формате дополнения до двух , интерпретируемое как кратное единицам величины, за исключением специального значения с ведущим битом знака 1 и всеми остальными битами, равными 0 (что представляет ). Quire основаны на работе Ульриха В. Кулиша и Уилларда Л. Миранкера . [16]NaR
Допустимые значения описываются как режим Unum типа III, который ограничивает результаты заданным диапазоном. [3]
Несколько программных и аппаратных решений реализуют posit. [14] [17] [18] [19] [20] Первый полностью параметризованный аппаратный генератор арифметики posit был предложен в 2018 году. [21]
Реализации Unum были исследованы в Julia [22] [23] [24] [25] [26] [27] и MATLAB . [28] [29] Доступна версия C++ [30] с поддержкой любых размеров posit в сочетании с любым количеством битов экспоненты. Быстрая реализация на языке C, SoftPosit, [31], предоставленная исследовательской группой NGA на основе Berkeley SoftFloat, дополняет доступные программные реализации.
Проект автор | Тип | Точности | Квайр Поддерживать? | Скорость | Тестирование | Примечания |
---|---|---|---|---|---|---|
ГП-ГПУ VividSparks | Первый в мире FPGA GPGPU | 32 | Да | ~3,2 ТПОПС | Исчерпывающий. Ошибок не обнаружено. | RacEr GP-GPU имеет 512 ядер |
SoftPosit А*ЗВЕЗДА | Библиотека C на основе Berkeley SoftFloat Обертка C++ для переопределения операторов Обертка Python с использованием SWIG SoftPosit | 8, 16, 32 опубликованы и завершены; | Да | ~60–110 MPOPS на ядре x86 (Broadwell) | 8: Исчерпывающий; 16: Исчерпывающий, за исключением FMA, quire 32: Исчерпывающий тест все еще продолжается. Известных ошибок нет. | Лицензия с открытым исходным кодом. Самая быстрая и полная библиотека C для posit на данный момент. Разработана для сравнения подключаемых модулей IEEE float и posit. |
posit4.nb А*ЗВЕЗДА | Блокнот Mathematica | Все | Да | < 80 КБОП | Исчерпывающий для низких точностей. Ошибок не обнаружено. | Открытый исходный код (лицензия MIT). Оригинальное определение и прототип. Наиболее полная среда для сравнения IEEE floats и posits. Множество примеров использования, включая линейные решатели |
posit-javascript А*ЗВЕЗДА | Виджет JavaScript | Преобразовать десятичную дробь в положительную 6, 8, 16, 32; создать таблицы 2–17 с помощью es 1–4. | Н/Д | N/A; интерактивный виджет | Полностью протестировано | Генератор таблиц и конвертация |
Универсальный Stillwater Supercomputing, Inc | Библиотека шаблонов C++ Библиотека C Обертка Python Библиотека Golang | Произвольная точность posit float допустима (p) Унум тип 1 (п) Унум тип 2 (п) | Произвольные конфигурации печати с программируемой емкостью | posit<4,0> 1 ГПОПС положение<8,0> 130 MPOPS положение<16,1> 115 MPOPS положение<32,2> 105 MPOPS положение<64,3> 50 MPOPS положение<128,4> 1 MPOPS положение<256,5> 800 KPOPS | Полный набор для проверки произвольных положений Случайные значения для больших конфигураций posit. Использует индукцию для доказательства того, что nbits+1 является правильным, нет известных ошибок | Открытый исходный код. Лицензия MIT. Полностью интегрирован с типами C/C++ и автоматическими преобразованиями. Поддерживает полную математическую библиотеку C++ (собственную и преобразование в/из IEEE). Интеграции среды выполнения: MTL4/MTL5, Eigen, Trilinos, HPR-BLAS. Интеграции приложений: G+SMO, FDBB, FEniCS, ODEintV2, TVM.ai. Интеграция с аппаратным ускорителем (Xilinx, Intel, Achronix). |
Спидго Чунг Шин Йи | Библиотека Python | Все | Нет | ~20 МПОПС | Обширный; нет известных ошибок | Открытый исходный код (лицензия MIT) |
softposit-rkt Дэвид Тьен | Крепления SoftPosit для ракетки | Все | Да | Неизвестный | Неизвестный | |
sfpy Билл Зорн | Привязки SoftPosit для Python | Все | Да | ~20–45 MPOPS на ядре Skylake 4,9 ГГц | Неизвестный | |
позитивная октава Диего Коэльо | Реализация октавы | Все | Нет | Неизвестный | Ограниченное тестирование; ошибок не обнаружено | GNU GPL |
Сигмоидальные числа Айзек Ёнемото | Библиотека Джулии | Все <32, все ES | Да | Неизвестный | Ошибок не обнаружено (позитивно). Ошибки деления (действительны) | Использует стандартную библиотеку шаблонов математики Julia, может выполнять матричные и тензорные операции, комплексные числа, БПФ, DiffEQ. Поддержка валидных значений |
FastSigmoid Айзек Ёнемото | Julia и библиотека 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" (Серлейн Леонг) | Да: Posit (8,0), Posit (16,1), Posit (32,2) Другие форматы не обладают полной функциональностью | Открытый исходный код. Проблемы и предложения на GitHub. Этот проект был разработан в связи с тем, что SigmoidNumbers и FastSigmoid Айзека Ёнемото в настоящее время не поддерживаются. Поддерживает основные функции линейной алгебры в Julia (умножение матриц, решение матриц, разложение Элгена и т. д.) |
ПиСигмовидная Кен Меркадо | Библиотека Python | Все | Да | < 20 МПОПС | Неизвестный | Открытый исходный код (лицензия MIT). Простой в использовании интерфейс. Пример нейронной сети. Поддержка комплексных функций. |
cppPosit Федерико Росси, Эмануэле Руффальди | библиотека С++ | 4–64 (любое значение es); «Версия шаблона от 2 до 63 бит» | Нет | Неизвестный | Несколько основных тестов | 4 уровня операций, работающих с posit. Специальная поддержка типов NaN (нестандартных) |
bfp:За пределами плавающей точки Клеман Герен | библиотека С++ | Любой | Нет | Неизвестный | Найдены ошибки; статус исправлений неизвестен | Поддерживает + – × ÷ √ обратные, отрицательные, сравниваемые |
Verilog.jl Айзек Ёнемото | Джулия и Верилог | 8, 16, 32, ЭС=0 | Нет | Неизвестный | Тщательно протестировано на 8-битной платформе, ошибок не обнаружено | Предназначено для приложений глубокого обучения Сложение, вычитание и умножение только. Была построена проверка концепции матричного умножителя, но ее точность не соответствует спецификации |
Арифметика Ломбика Технологии Ломбик | C# с Hastlayer для генерации оборудования | 8, 16, 32. (64 бит в процессе) | Да | 10 МПОПС Нажмите здесь для получения дополнительной информации | Частичный | Требуются API Microsoft .Net |
Deepfloat Джефф Джонсон, Facebook | СистемаVerilog | Любой (параметризованный SystemVerilog) | Да | Н/Д (RTL для проектов FPGA/ASIC) | Ограниченный | Не соответствует строго требованиям спецификации. Поддерживает +,-,/,*. Реализует как логарифмическое позиционирование, так и нормальное, «линейное» позиционирование Лицензия: CC-BY-NC 4.0 в настоящее время |
Токийский технологический институт | ПЛИС | 16, 32, выдвижной | Нет | "2 ГГц", не переведено в MPOPS | Частично; известные ошибки округления | Пока еще не с открытым исходным кодом |
PACoGen: Генератор ядра Posit Arthmetic Маниш Кумар Джайсвал | Verilog HDL для арифметики Posit | Любая точность. Возможность генерировать любую комбинацию размера слова (N) и размера экспоненты (ES) | Нет | Скорость проектирования зависит от базовой аппаратной платформы (ASIC/FPGA) | Исчерпывающие тесты для 8-битного posit. Выполняются миллионы случайных тестов для 32-битных POSIT с различными комбинациями ES. | Поддерживает метод округления до ближайшего целого числа. |
Винай Саксена, Центр исследований и технологий Роберта Боша, Индия (RTC-IN) и Фархад Мерчант, Рейнско-Вестфальский технический университет Ахена | Генератор Verilog для СБИС, ПЛИС | Все | Нет | Аналогично числам с плавающей точкой одинакового размера | Н=8 - ES=2 | N=7,8,9,10,11,12 Выборочные (20000*65536) комбинации для - ES=1 | N=16 | Для использования в коммерческих продуктах. Насколько нам известно. ***Первая интеграция posit в RISC-V*** |
Ядро RISC-V с поддержкой Posit (Сугандха Тивари, Нил Гала, Честер Ребейро, В.Камакоти, ИИТ МАДРАС) | Реализация BSV (Bluespec System Verilog) | 32-битный posit с (es=2) и (es=3) | Нет | — | Проверено с помощью SoftPosit для (es=2) и протестировано с несколькими приложениями для (es=2) и (es=3). Ошибок не обнаружено. | Первое полное ядро RISC-V с поддержкой posit. Поддерживает динамическое переключение между (es=2) и (es=3). Более подробная информация здесь. |
ПЕРСИВАЛЬ Дэвид Малласен | Ядро Posit RISC-V с открытым исходным кодом и возможностью Quire | Posit<32,2> с 512-битным набором | Да | Скорость проектирования зависит от базовой аппаратной платформы (ASIC/FPGA) | Тестирование функциональности каждой инструкции. | Ядро RISC-V с поддержкой posit на уровне приложений на основе CVA6, которое может выполнять все инструкции posit, включая объединенные операции quire. PERCIVAL — это первая работа, которая интегрирует полный posit ISA и quire в аппаратное обеспечение. Она позволяет выполнять как собственные инструкции posit, так и стандартные инструкции с плавающей точкой одновременно. |
LibPosit Крис Ломонт | Отдельный файл C# Лицензия MIT | Любой размер | Нет | Обширный; нет известных ошибок | Операции: арифметика, сравнения, sqrt, sin, cos, tan, acos, asin, atan, pow, exp, log. | |
unumjl REX-вычисления | Версия FPGA процессора VLIW "Neo" с положительным числовым модулем | 32 | Нет | ~1,2 ГПОПС | Обширный; нет известных ошибок | Никакого деления или квадратного корня. Первая полноценная разработка процессора для замены float на posit. |
PNU: Позитивная числовая единица Каллиго Тех |
|
| Да — полностью поддерживается. | 500 МГц * 8 ядер | Завершены исчерпывающие тесты для 32- и 64-битных платформ с поддержкой Quire. Приложения протестированы и доступны для беспрепятственного внедрения www.calligotech.com | Полностью интегрирован с типами C/C++ и автоматическими преобразованиями. Поддерживает полную математическую библиотеку C++ (собственную и преобразование в/из IEEE). Интеграции среды выполнения: GNU Utils, OpenBLAS, CBLAS. Интеграции приложений: в процессе. Расширенная поддержка компиляторов: C/C++, G++, GFortran и LLVM (в процессе). |
IBM-TACC Цзяньюй Чэнь | Специализированная ПЛИС | 32 | Да | 16–64 ГПОПС | Только один известный проверенный случай | Выполняет умножение матриц размером 128 на 128 (SGEMM) с использованием quire. |
Глубокий PeNSieve Рауль Мурильо | Библиотека Python (программное обеспечение) | 8, 16, 32 | Да | Неизвестный | Неизвестный | Структура DNN с использованием posits |
Госит Яап Аартс | Чистая библиотека Go | 16/1 32/2 (включен общий 32/ES для ES<32) [ необходимо разъяснение ] | Нет | 80 MPOPS для div32/2 и подобных линейных функций. Намного выше для truncate и намного ниже для exp. | Фаззинг против C softposit с большим количеством итераций для 16/1 и 32/2. Найдены явные тестовые пограничные случаи. | (Лицензия MIT) Реализации, где ES является константой, генерируются в коде. Генератор должен иметь возможность генерировать для всех размеров {8,16,32} и ES меньше размера. Однако те, которые не включены в библиотеку по умолчанию, не тестируются, не подвергаются фаззингу или поддерживаются. Для некоторых операций на 32/ES возможно смешивание и сопоставление ES. Однако это не тестируется. |
SoftPosit [31] — программная реализация posit на основе Berkeley SoftFloat. [32] Позволяет программно сравнивать posit и float. В настоящее время поддерживает
Он работает для 16-битных posit с одним битом экспоненты и 8-битных posit с нулевым битом экспоненты. Поддержка 32-битных posit и гибкого типа (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 ); // Чтобы проверить ответ, преобразуя его в double double dZ = convertP8ToDouble ( pZ ); printf ( "dZ: %.15f \n " , dZ ); // Чтобы вывести результат в двоичном формате (предупреждение: непереносимый код) uint8_t uiZ = castUI8 ( pZ ); printBinary (( uint64_t * ) & uiZ , 8 ); вернуть 0 ; }
Объединенное скалярное произведение с quire16_t
// Преобразуем double в 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 ; // Устанавливаем quire на 0 qZ = q16_clr ( qZ ); // Накапливаем произведения без округлений qZ = q16_fdp_add ( qZ , pA , pB ); qZ = q16_fdp_add ( qZ , pC , pD ); // Преобразуем обратно в posit posit16_t pZ = q16_to_p16 ( qZ ); // Для проверки ответа double dZ = convertP16ToDouble ( pZ );
Уильям М. Кахан, главный архитектор IEEE 754-1985, критикует unums типа I по следующим причинам (некоторые из них рассматриваются в стандартах типа II и типа III): [6] [33]
JG: Слово «unum» является сокращением от «универсальное число», так же как слово «bit» является сокращением от «двоичная цифра».
Сначала я назвал их «unums 2.0», что показалось мне столь же хорошим названием для концепции, как и любое другое, но на самом деле это не столько «последний релиз», сколько альтернатива.