Экзотические архитектуры, о которых заботятся комитеты по стандартам - PullRequest
144 голосов
/ 07 августа 2011

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

Я знаю, что 40 лет назад у любого компьютера была своя уникальная спецификация.Однако я не знаю ни одной архитектуры, используемой сегодня, где:

  • CHAR_BIT != 8
  • signed не является дополнением к двум (я слышал, у Java были проблемы с этим).
  • С плавающей точкой не соответствует стандарту IEEE 754 (Изменить: я имел в виду «не в двоичном кодировании IEEE 754»).

Причина, по которой я спрашиваю, состоит в том, что я часто объясняю людямхорошо, что C ++ не требует никаких других низкоуровневых аспектов, таких как типы фиксированного размера .Это хорошо, потому что, в отличие от «других языков», он делает ваш код переносимым при правильном использовании (Edit: потому что он может быть перенесен на большее количество архитектур, не требуя эмуляции низкоуровневых аспектов машины, таких как, например, арифметика двух дополнений в архитектуре знак + величина),Но мне жаль, что я сам не могу указать на какую-то конкретную архитектуру.

Так что вопрос в том, какие архитектуры обладают вышеуказанными свойствами?

uint*_t s не являются обязательными.

Ответы [ 7 ]

105 голосов
/ 07 августа 2011

Взгляните на это

Серверы Unisys ClearPath Dorado

предлагает обратную совместимость для людей, которые еще не перенесли все свои программы Univac.

Ключевые моменты:

  • 36-битные слова
  • CHAR_BIT == 9
  • дополнение
  • 72-битная не с плавающей точкой IEEE
  • отдельное адресное пространство для кода и данных
  • слово-имя
  • нет выделенного указателя стека

Не знаю, предлагают ли они компилятор C ++, но они могут .


А теперь появилась ссылка на недавний выпуск их руководства по C:

Справочное руководство по программированию компилятора Unisys C

Раздел 4.5 содержит таблицу типов данных с 9, 18, 36 и 72 битами.

size and range of data types in USC C compiler

47 голосов
/ 08 августа 2011

Ни одно из ваших предположений не относится к мэйнфреймам. Для начала я не знаю мэйнфрейма, который использует IEEE 754: IBM использует базу с плавающей запятой 16, и оба мейнфрейма Unisys используют базу 8. Машины Unisys немного особенным во многих других отношениях: Бо упомянул архитектуру 2200, но архитектура MPS еще более странная: 48-битные слова с тегами. (Является ли слово указателем или нет, зависит от слова в слове.) И числовые представления разработаны так, чтобы не было реального Различие между плавающей точкой и интегральной арифметикой: плавающая точка является основанием 8; не требует нормализации, и в отличие от каждого другая плавающая точка, которую я видел, ставит десятичную справа от мантисса, а не левая, и использует звездную величину для показатель степени (в дополнение к мантиссе). С результатами, которые интегральное значение с плавающей запятой имеет (или может иметь) точно такой же бит представление в виде целого числа со знаком. И нет плавающих точечные арифметические инструкции: если показатели двух значений оба 0, инструкция делает целочисленную арифметику, в противном случае она делает арифметика с плавающей точкой. (Продолжение философии тегирования в архитектура.) Это означает, что хотя int может занимать 48 бит, 8 из них должно быть 0, иначе значение не будет рассматриваться как целое число.

39 голосов
/ 07 августа 2011

Я нашел эту ссылку, в которой перечислены некоторые системы , где CHAR_BIT != 8.Они включают в себя

некоторые ЦСП TI имеют CHAR_BIT == 16

чип BlueCore-5 (чип Bluetooth от Cambridge Silicon Radio), который имеет CHAR_BIT == 16.

И, конечно, есть вопрос о переполнении стека: На каких платформах есть что-то, кроме 8-битного символа

Что касается систем, не являющихся дополнениями к двум, есть интересное прочтение по comp.lang.c ++. moderated .Подводя итог: есть платформы, имеющие свое дополнение или знак и представление величины.

39 голосов
/ 07 августа 2011

Полное соответствие IEEE 754 редко встречается в реализациях с плавающей запятой.А ослабление спецификации в этом отношении допускает много оптимизаций.

Например, поддержка субнорм различается между x87 и SSE.

Оптимизации, такие как слияние умножения и сложения, которые были немного разделены в исходном кодеизменить результаты тоже, но это хорошая оптимизация для некоторых архитектур.

Или для x86 строгое соответствие IEEE может потребовать установки определенных флагов или дополнительных переносов между регистрами с плавающей запятой и обычной памятью, чтобы заставить его использовать указанную с плавающей запятойtype вместо внутренних 80-битных операций с плавающей запятой.

И некоторые платформы вообще не имеют аппаратных операций с плавающей запятой и, следовательно, должны эмулировать их в программном обеспечении.А некоторые требования IEEE 754 могут быть дорогостоящими для реализации в программном обеспечении.В частности, могут возникнуть проблемы с правилами округления.

Я пришел к выводу, что вам не нужны экзотические архитектуры для того, чтобы попасть в ситуации, когда вы не всегда хотите гарантировать строгое соответствие IEEE.По этой причине немногие языки программирования гарантировали строгое соответствие IEEE.

22 голосов
/ 08 августа 2011

Я вполне уверен, что системы VAX все еще используются. Они не поддерживают IEEE с плавающей точкой; они используют свои собственные форматы. Alpha поддерживает форматы VAX и IEEE с плавающей точкой.

Векторные машины Cray, такие как T90, также имеют свой собственный формат с плавающей запятой, хотя в более новых системах Cray используется IEEE. (T90, который я использовал, был выведен из эксплуатации несколько лет назад; я не знаю, находятся ли еще в активном использовании.)

T90 также имел / имеет некоторые интересные представления для указателей и целых чисел. Собственный адрес может указывать только на 64-битное слово. Компиляторы C и C ++ имели CHAR_BIT == 8 (необходимо, потому что он запускал Unicos, разновидность Unix и должен был взаимодействовать с другими системами), но собственный адрес мог указывать только на 64-битное слово. Все операции на уровне байтов были синтезированы компилятором, и void* или char* сохранили смещение байта в старших 3 битах слова. И я думаю, что у некоторых целочисленных типов есть биты заполнения.

Мэйнфреймы IBM - еще один пример.

С другой стороны, этим конкретным системам не обязательно обязательно исключать изменения в языковом стандарте. Cray не проявил особого интереса к обновлению своего компилятора C до C99; предположительно то же самое применимо к компилятору C ++. может быть разумно ужесточить требования к размещенным реализациям, таким как требование CHAR_BIT == 8, с плавающей запятой формата IEEE, если не полная семантика, и дополнение к 2 без битов заполнения для целых чисел со знаком. Старые системы могли продолжать поддерживать более ранние языковые стандарты (C90 не умер, когда вышел C99), и требования могли быть более свободными для автономных реализаций (встроенных систем), таких как DSP.

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

14 голосов
/ 13 октября 2016

CHAR_BITS

Согласно gcc исходный код:

CHAR_BIT - это 16 бит для 1750a , dsp16xx архитектур.
CHAR_BIT - это 24 бит для архитектуры dsp56k .
CHAR_BIT - это 32 бит для c4x архитектуры.

Вы можете легко найти больше, выполнив:

find $GCC_SOURCE_TREE -type f | xargs grep "#define CHAR_TYPE_SIZE"

или

find $GCC_SOURCE_TREE -type f | xargs grep "#define BITS_PER_UNIT"

, если CHAR_TYPE_SIZE определено надлежащим образом.

Соответствие IEEE 754

Если целевая архитектура не поддерживает инструкции с плавающей запятой, gcc может генерировать программный резерв, который по умолчанию не соответствует стандарту. Более того, можно использовать специальные параметры (например, -funsafe-math-optimizations, в котором также отключено сохранение знака для нулей).

7 голосов
/ 13 октября 2016

Двоичное представление IEEE 754 на GPU до недавнего времени было редкостью, см. Паранойя с плавающей запятой для GPU .

РЕДАКТИРОВАТЬ: в комментариях был поднят вопрос, имеет ли отношение с плавающей запятой GPU к обычному компьютерному программированию, не связанному с графикой. Да, черт возьми! Самые высокопроизводительные вычисления, производимые сегодня, выполняются на графических процессорах; список включает AI, интеллектуальный анализ данных, нейронные сети, физическое моделирование, прогноз погоды и многое другое. Одна из ссылок в комментариях показывает почему: преимущество графических процессоров с плавающей запятой порядка .

Я хотел бы добавить еще одну вещь, которая более актуальна для вопроса OP: что люди делали 10-15 лет назад, когда плавающая точка графического процессора не была IEEE и когда не было API, такого как сегодняшний OpenCL или CUDA, для программные графические процессоры? Хотите верьте, хотите нет, но первые пионеры вычислений на GPU сумели программировать GPU без API, чтобы сделать это ! Я встретил одного из них в моей компании. Вот что он сделал: он кодировал данные, необходимые для вычисления, в виде изображения с пикселями, представляющими значения, над которыми он работал, а затем использовал OpenGL для выполнения необходимых операций (таких как «размытие по Гауссу» для представления свертки с нормальным распределением). и т. д.) и декодировал полученное изображение обратно в массив результатов. И это все же было быстрее, чем при использовании процессора!

Подобные вещи побудили NVidia наконец-то сделать свои двоичные данные внутренними, совместимыми с IEEE и представить API, ориентированный на вычисления, а не на манипуляции с изображениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...