Математичний співпроцесор

Математичний співпроцесор 80x287 в колодці на базовій платі персонального комп'ютера.
Співпроцесор Motorola 68881

Математичний співпроцесор - співпроцесор для розширення командного безлічі центрального процесора і забезпечує його функціональністю модуля операцій з плаваючою комою, для процесорів, що не мають інтегрованого модуля.

Модуль операцій з плаваючою комою (або з плаваючою точкою; англ. floating point unit (FPU) ) - Частина процесора для виконання широкого спектру математичних операцій над речовими числами.

Простим " цілочисловим "процесорам для роботи з речовими числами і математичними операціями потрібні відповідні процедури підтримки і час для їх виконання. Модуль операцій з плаваючою комою підтримує роботу з ними на рівні примітивів - завантаження, вивантаження дійсного числа (в / із спеціалізованих регістрів) або математична операція над ними виконується однією командою, за рахунок цього досягається значне прискорення таких операцій.


1. Співпроцесори

x87 - це спеціальний набір інструкцій для роботи з математичними обчисленнями, є підмножиною архітектури процесорів x86. Таку назву він отримав, тому що первісні окремі математичні сопроцессорние чіпи мали назви, що закінчуються на 87. Як і інші розширення базового набору інструкцій процесора, ці інструкції не є строго необхідними для побудови робочої програми, але будучи апаратно реалізованими, загальні математичні завдання вони дозволяють виконувати набагато швидше. Наприклад, в наборі інструкцій x87 присутні команди для розрахунку значень синуса або косинуса.


1.1. Співпроцесори Intel сімейства x86

Для процесорів сімейства x86 з 8086 / 8088 по 386, модуль операцій з плаваючою комою був виділений в окрему мікросхему, звану математичним співпроцесором. Для установки співпроцесора на плату комп'ютера передбачався окремий роз'єм.

Співпроцесор не є повноцінним процесором, так як не вміє робити багатьох необхідних для цього операцій (наприклад, не вміє працювати з програмою і обчислювати адреси пам'яті), будучи всього лише придатком центрального процесора.

Одна зі схем взаємодії центрального процесора і співпроцесора, застосовувана, зокрема, в x86 співпроцесор, реалізується наступним чином:

  • Співпроцесор підключений до шин центрального процесора, а також має декілька спеціальних сигналів для синхронізації процесорів між собою.
  • Частина командних кодів центрального процесора зарезервована для співпроцесора, він стежить за потоком команд, ігноруючи інші команди. Центральний процесор, навпаки, ігнорує команди співпроцесора, займаючись тільки обчисленням адреси в пам'яті, якщо команда припускає до неї звернення. Центральний процесор робить цикл фіктивного зчитування, дозволяючи сопроцессору вважати адресу з адресної шини. Якщо сопроцессору необхідно додаткове звернення до пам'яті (для читання або запису результатів), він виконує його через захоплення шини.
  • Після отримання команди і необхідних даних співпроцесор починає її виконання. Поки співпроцесор виконує команду, центральний процесор виконує програму далі, паралельно з обчисленнями співпроцесора. Якщо наступна команда також є командою співпроцесора, процесор зупиняється і чекає завершення виконання співпроцесором попередньої команди.
  • Також існує спеціальна команда очікування (FWAIT), примусово зупиняє процесор до завершення обчислень (якщо для продовження програми необхідні їх результати). В даний час команда використовується лише для обробки виключень при роботі з плаваючою точкою, робота процесора і співпроцесора синхронізується прозоро для програміста [1].

Починаючи з процесора Intel486DX модуль операцій з плаваючою комою був інтегрований в центральний процесор і названий FPU. У лінійці Intel486SX модуль FPU відключався (спочатку в цю лінійку потрапляли процесори з бракованим FPU). Для процесорів Intel486SX також випускався "співпроцесор" Intel487SX, але, фактично, він був процесором Intel486DX і при його установці процесор Intel486SX відключався.

Незважаючи на інтеграцію, FPU в процесорах i486 являє собою незмінний співпроцесор, виконаний на тому ж кристалі, більш того, схема FPU i486 повністю ідентична сопроцессору попереднього покоління 387DX аж до тактової частоти (у два рази меншою, ніж частота центрального процесора). Справжня інтеграція FPU c центральним процесором почалася тільки в процесорах Pentium моделі MMX.


1.2. Співпроцесори 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


1.3. Інші платформи

Аналогічно, материнські плати ПК, побудованих на процесорах Motorola, до розробки цієї фірмою процесора MC68040 (в який співпроцесор був вбудований) містили математичний співпроцесор. Як правило, в якості FPU використовувався співпроцесор 68881 16 МГц або 68 882 25 МГц. Практично будь-який сучасний процесор має убудований співпроцесор.

Компанія Weitek також випускала математичні співпроцесори для платформ 68000 і MIPS.


2. Пристрій FPU

Всі процесори Intel і AMD, починаючи з 486DX, мають вбудований математичний співпроцесор, і в окремому співпроцесор не потребують (за винятком Intel486SX). Тим не менш, термін x87 все ще використовується для виділення тієї частини інструкцій процесора, яка займається обчисленнями з використанням плаваючою комою; компілятори можуть використовувати ці інструкції для виробництва коду, який працює швидше, ніж той, що використовує виклики до бібліотек для виконання операцій з плаваючою комою.

Інструкції x87 сумісні зі стандартом IEEE-754. Однак, x87 виконують операції не в суворій відповідності з форматами IEEE-754, через використання більш широких регістрів. Тому послідовність арифметичних операцій може виконуватися кілька по-різному на наборі x87 і на процесорі, суворо наступному формату IEEE-754.

x87 організовує свої регістри не як масив, як більшість інших архітектур, а як регістровий стек, що працює за принципом зворотної польської записи. Це означає, що в один момент часу, тільки два верхніх регістра доступні для проведення операцій, а доступ до інших регістрів вимагає маніпуляцій зі стеком. Хоча така організація виходить і зручною для програмістів, вона робить трудомістким побудова ефективного коду x87 для компіляторів.

Починаючи з Pentium III, обчислення за допомогою інструкцій SSE здійснюються з одинарною точністю, а в більш пізніх версіях - з подвійною точністю форматів IEEE-754. Після появи SSE2, використання x87 в значній мірі применшується в 64-розрядних архітектурах x86-64 і пов'язаних з нею 64-бітових реалізаціях операційних систем, таких як Microsoft Windows, Mac OS X, Solaris, FreeBSD і Linux, хоча він як і раніше добре підтримується для повної сумісності зі старими програмами.

Модуль операцій з плаваючою комою [2] [3] являє собою стековий калькулятор, який працює за принципом зворотної польської записи. Перед операцією аргументи поміщаються в LIFO - стек, при виконанні операції необхідна кількість аргументів знімається зі стека. Результат операції поміщається в стек, де може бути використаний в подальших обчисленнях або може бути знятий зі стека для запису в пам'ять. Також підтримується і пряма адресація аргументів в стеку щодо вершини.


2.1. Формати даних

Усередині FPU числа зберігаються в 80-бітному форматі з плаваючою комою, для запису же або читання з пам'яті можуть використовуватися:

  • Речові числа у трьох форматах: короткому (32 біта), довгому (64 біта) і розширеному (80 біт).
  • Двійкові цілі числа в трьох форматах: 16, 32 і 64 біта.
  • Упаковані цілі десяткові числа (BCD) числа - довжина максимального числа становить 18 упакованих десяткових цифр (72 біта).

FPU також підтримує спеціальні чисельні значення:

  • Денормалізованние речові числа - числа, які менше мінімального нормалізованого числа. При формуванні такого значення в деякому регістрі стека у відповідному цього регістру теге регістра TWR формується спеціальне значення (10).
  • Нескінченність (позитивна і негативна), виникає при діленні на нуль ненульового значення, а також при переповнених. При формуванні такого значення в деякому регістрі стека у відповідному цього регістру теге регістра TWR формується спеціальне значення (10).
  • нечісло ( англ. not-a-number (NaN) ). Розрізняють два види нечісел:
    • SNaN (Signaling Non a Number) - сигнальні нечісла. Співпроцесор реагує на появу цього числа в регістрі стека збудженням виключення недійсною операції. Співпроцесор не формує сигнальних чисел. Програмісти формують такі числа навмисно, щоб збудити в потрібній ситуації виняток.
    • QNaN (Quiet Non a Number) - спокійні (тихі) нечісла. Співпроцесор може формувати спокійні нечісла в якості реакції на певні винятки, наприклад число речовій невизначеності.
  • Нуль - у форматі з плаваючою комою, нуль також вважається спеціальним значенням.
  • Невизначеності та непідтримувані формати. Існує багато бітових наборів, які можна представити у розширеному форматі дійсного числа. Для більшості їх значень формується виключення недійсною операції.

2.2. Регістри

У FPU можна виділити три групи регістрів:

  • Стек процесора: регістри R0 .. R7. Розмірність кожного регістру: 80 біт.
  • Службові регістри
    • Регістр стану процесора SWR (Status Word Register) - інформація про поточний стан співпроцесора. Розмірність: 16 біт.
    • Керуючий регістр співпроцесора CWR (Control Word Register) - управління режимами роботи співпроцесора. Розмірність: 16 біт.
    • Регістр слова тегів TWR (Tags Word Register) - контроль за регістрами R0 .. R7 (наприклад, для визначення можливості запису) Розмірність: 16 біт.
  • Регістри покажчиків
    • Покажчик даних DPR (Data Point Register). Розмірність: 48 біт.
    • Покажчик команд IPR (Instruction Point Register). Розмірність: 48 біт.

2.3. Система команд співпроцесора

Система включає близько 80 команд. Їх класифікація:

  • Команди передачі даних
    • Речові дані
    • Цілочисельні дані
    • Десяткові дані
    • Завантаження констант (0, 1, число Пі, log 2 (10), log 2 (e), lg (2), ln (2))
    • Обмін
    • Умовна пересилання (Pentium II / III)
  • Команди порівняння даних
    • Речові дані
    • Цілочисельні дані
    • Аналіз
    • З нулем
    • Умовне порівняння (Pentium II / III)
  • Арифметичні команди
    • Речові дані: додавання, віднімання, множення, ділення
    • Цілочисельні дані: додавання, віднімання, множення, ділення
    • Допоміжні арифметичні команди (квадратний корінь, модуль, зміна знака, виділення порядку і мантиси)
  • Трансцендентні команди
    • Тригонометрія: синус, косинус, тангенс, арктангенс
    • Обчислення логарифмів і ступенів
  • Команди управління
    • Ініціалізація співпроцесора
    • Робота із середовищем
    • Робота зі стеком
    • Перемикання режимів

Примітки

  1. Intel 64 and IA-32 Architectures Software Developer's Manual. Volume 2A and 2B: Instruction Set Reference. Order numbers # 253666, # 253667
  2. Intel 64 and IA-32 Architectures Software Developer's Manual. Volume 1: Basic Architecture. Order number # 253665
  3. AMD64 Architecture Programmer's Manual. Volume 1: Application Programming. Publication number # 24592


Перегляд цього шаблону Технології цифрових процесорів
Архітектура

CISC EDGE EPIC MISC URISC RISC VLIW ZISC Фон Неймана Гарвардська

8 біт 16 біт 32 біт 64 біт 128 біт
Паралелізм
Pipeline Конвеєр Позачергове і почергове виконання Перейменування регістрів Спекулятивне виконання
Рівні Біт Інструкцій Суперскалярної Даних Завдань
Потоки Багатопоточність Simultaneous multithreading Hyperthreading Superthreading Апаратна віртуалізація
Класифікація Флінна SISD SIMD MISD MIMD
Реалізації DSP GPU SoC PPU Векторний процесор Математичний співпроцесор Мікропроцесор Мікроконтролер
Компоненти Barrel shifter FPU BSB MMU TLB Регістровий файл control unit АЛУ Демультиплексор Мультиплексор Мікрокод Тактова частота Корпус Регістри Кеш ( Кеш процесора)
Управління харчуванням APM ACPI Clock gating Динамічна зміна частоти Динамічна зміна напруги