Математический сопроцессор
Материал из Википедии — свободной энциклопедии
Математический сопроцессор — сопроцессор для расширения командного множества центрального процессора и обеспечивание его функциональностью модуля операций с плавающей запятой, для процессоров не имеющих интегрованной модуля.
Модуль операций с плавающей запятой (или с плавающей точкой; англ. floating point unit (FPU)) — часть процессора для выполнения широкого спектра математических операций над вещественными числами.
Простым «целочисленным» процессорам, работа с вещественными числами и математическими операциями требует соответствующих процедур поддержки и времени для их выполнения. Модуль операций с плавающей запятой поддерживает работу с ними на уровне примитивов — загрузка, выгрузка вещественного числа (в/из специализированных регистров) или математичекая операция над ними выполняется одной командой, за счет этого достигается значительное ускорение таких операций.
Содержание |
[править] Сопроцессоры
[править] Сопроцессоры Intel семейства x86
Дла процессоров семейства x86 с 8086/8088 по 386, модуль операций с плавающей запятой был выделен в отдельную микросхему, называемую математическим сопроцессором. Для сопроцессора на плате компьютера предуматривался отдельный сокет.
Сопроцессор не является полноценным процессором, так как не умеет делать многих необходимых для этого операций (например не умеет работать с программой и вычислять адреса памяти), всего лишь, являсь придатком центрального процессора.
Одна из схем взаимодействия центрального процессора и сопроцессора, применяемая, в частности, в x87 сопроцессорах, реализуется следующим образом:
- Сопроцессор подключен к шинам центрального процессора, а также имеет несколько специальных сигналов для синхронизации процессоров между собой.
- Часть командных кодов центрального процессора зарезервирована для сопроцессора, он следит за потоком команд, игнорируя другие команды. Центральный процессор наоборот игнорирует команды сопроцессора, занимаясь только вычислением адреса в памяти, если команда предполагает к ней обращение. Центральный процессор делает цикл фиктивного считывания, позволяя сопроцессору считать адрес с адресной шины. Если сопроцессору необходимо дополнительное обращение к памяти (для чтения или записи результатов) он выполняет его через захват шины.
- После получения команды и необходимых данных, сопроцессор начинает ее выполнение. Пока сопроцессор выполняет команду, центральный процессор выполняет программу дальше, параллельно с вычислениями сопроцессора. Если следующая команда также является командой сопроцессора, процессор останавливается и ожидает завершения выполнения сопроцессором предыдущей команды.
- Также существует специальная команда ожидания (FWAIT), также, останавливающая процессор до завершения вычислений (если для продолжения программы необходимы их результаты).
Начиная с процессора i486 (линейки DX) модуль операций с плавающей запятой был интегрирован в центральный процессор и назван FPU. В линейке 486SX модуль FPU отключался (в эту линейку попадали процессоры с бракованным FPU). Для процессоров 486SX также выпускался «сопроцессор» 487SX, но, фактически, он являлся процессором 486DX, и при его установке, процессор 486SX отключался.
Несмотря на интеграцию, FPU в процессорах i486, представляет собой неизменный сопроцессор, выполненный на том же кристалле, более того, схема FPU i486, полностью идентична сопроцессору предыдущего поколения 387DX вплоть до тактовой частоты (в два раза меньшей чем частота центрального процессора). Настоящая интеграция FPU c центральным процессором началась только в процессорах Pentium модели MMX.
[править] Сопроцессоры x86 от сторонних производителей
Широкое распространение в соответствующий период получили сопроцессоры для платформы x86 выпускавшиеся компанией Weitek - ею были выпущены 1167, 2167 в виде набора микросхем и микросхемы 3167, 4167 соответственно для процессоров 8086, 80286, 80386, 80486. По сравнению с сопроцессорами от Intel они обеспечивали в 2-3 раза большую производительность, но обладали несовместимым программным интерфейсом, реализованным через технологию memory-mapping. Она сводилась к тому, что основной процессор должен был записывать информацию в те или иные области памяти, контролируемые Weitek-овским сопроцессором (собственно оперативной памяти там, конечно не было). Конкретный адрес, куда производилась запись интерпретировался в качестве той или иной команды. Несмотря на несовместимость, сопроцессоры от Weitek были широко поддержаны как разработчиками ПО, так и производителями материнских плат, предусматривавших на них гнёзда для установки такой микросхемы.
Ряд других компаний так же выпускал различные несовместимые математические сопроцессоры, реализуя интерфейс к ним через порты ввода-вывода или прерывания BIOS, но они не получили такого широкого распространения.
Компании-производители клонов выпускали совместимые с 80287 80387 сопроцессоры, работавшие быстрее аналогичных интеловских. Среди этих компаний можно упомянуть Cyrix, AMD, Chips & Technologies (C&T) и проч. Иногда система команд этих сопроцессоров расширялась несколькими несовместимыми, например аналог 80287 от C&T содержал команды для работы с вектором из четырёх значений с плавающей точкой. Серьёзной поддержки от производителей софта эти расширенные команды не получили.
Просессоры EMC87 от фирмы Cyrix могли работать как в режиме программной совместимости с Intel 80387 так и в собственном проприетарном режиме программирования. Для них обеспечивалась аппаратная совместимость с разъёмом 80387-го сопроцессора.
В СССР выпускалась микросхема (КМ)1810ВМ87, которая являлась аналогом 8087
[править] Другие платформы
Аналогично, материнские платы ПК построенных на процессорах Motorola до разработки последней процессора MC68040 (в который сопроцессор был встроен) содержали математический сопроцессор. Как правило, в качестве FPU использовался сопроцессор 68881 16 МГц или 68882 25 МГц. Практически любой современный процессор имеет встроенный сопроцессор.
Компания Weitek так же выпускала математические сопроцессоры для платформ 68000 и MIPS.
[править] Устройство FPU
Модуль операций с плавающей запятой представляет собой стековый калькулятор, работающий по принципу обратной польской записи. Перед операцией, аргументы помещаются в LIFO-стек, при выполнении операции, необходимое количество аргументов снимается со стека. Результат операции помещается в стек, где может быть использован в дальнейших вычислениях или может быть снят со стека для записи в память. Также поддерживается и прямая адресация аргументов в стеке относительно вершины.
Внутри FPU числа хранятся в 80-битном формате с плавающей запятой, для записи же, или чтения из памяти могут использоваться:
- один из трёх форматов с плавающей точкой (32, 64 и 80 бит),
- целочисленные форматы (16, 32 и 64 бита),
- 80-битный BCD-формат.
Поддерживаемые математические операции: арифметические операции, сравнение, деление по модулю, округление, смена знака, модуль, квадратный корень, синус, косинус, частичный тангенс, частичный арктангенс, загрузка константы (0, 1, число пи, log2(10), log2(e), lg(2), ln(2)) и некоторые другие специфичные операции.
FPU умеет обрабатывать пограничные состояния с помощью специальных значений представимых форматом с плавающей запятой:
- денормализованное число (близкое к переполнению), при дальнейшем возрастании модуля, денормализованное число становится бесконечностью,
- бесконечность (положительная и отрицательная), возникает при делении на нуль ненулевого значения а также при переполнениях,
- нечисло (англ. not-a-number (NaN)). Нечисла могут определять такие случаи как:
- неопределённость, возникает при комплексном результате (например при вычислении квадратного корня из отрицательного числа) и некоторых других случаях,
- недействительное значение (qNaN, sNaN) - может использоваться компилятором (для предотвращения использования неинициализированных переменных) или отладчиком,
- нуль - в формате с плавающей запятой, нуль также считается специальным значением.
В зависимости от флагов FPU, специальные значения могут инициировать обработку исключения операционной системой.