RISC - Reduced (Restricted) Instruction Set Computer - процессоры (компьютеры) с сокращенной системой команд. Эти процессоры обычно имеют набор однородных регистров универсального назначения, причем их число может быть большим. Система команд отличается относительной простотой, коды инструкций имеют четкую структуру, как правило, с фиксированной длиной. В результате аппаратная реализация такой архитектуры позволяет с небольшими затратами декодировать и выполнять эти инструкции за минимальное (в пределе 1) число тактов синхронизации. Определенные преимущества дает и унификация регистров.
CISC - Complete Instruction Set Computer - процессоры (компьютеры) с полным набором инструкций, к которым относится и семейство х86. Состав и назначение их регистров существенно неоднородны, широкий набор команд усложняет декодирование инструкций, на что расходуются аппаратные ресурсы. Возрастает число тактов, необходимое для выполнения инструкций.
Процессоры х86 имеют самую сложную в мире систему команд. Хорошо ли это, вопрос спорный, но груз совместимости с программным обеспечением для IBM PC, имеющим уже 20-летнюю историю, не позволяет расставаться с этим "наследием тяжелого прошлого". В процессорах семейства х86, начиная с 486, применяется комбинированная архитектура - CISC-процессор имеет RISC-ядро.
Различают следующие способы организации вычислительного процесса:
один поток команд - один поток данных (Simple Instruction - Simple Data, SISD) - характерно для традиционной фон-неймановской архитектуры (иногда вместо Simple пишут Single);
один поток команд - множественный поток данных (Simple Instruction - Multiple Data, SIMD) - технология MMX;
множественный поток команд - один поток данных (Multiple Instruction - Simple Data, MISD);
множественный поток команд - множественный поток данных (Multiple Instruction - Multiple Data, MIMD).
Рассмотрим порядок исполнения инструкций обработки данных - выполнения арифметических или логических функций. Во многих случаях инструкция работает с парой операндов - операндом назначения dest (destination) и операндом-источником src (source). Традиционная схема действия инструкции: dest = F (dest, srс), где F - некоторая функция от двух переменных. Это означает, что при выполнении инструкции процессор извлекает из указанных в инструкции мест (регистр, память, константа в самой инструкции) пару двоичных чисел, и результат действия над ними записывает на место одного из них (dest). Для выполнения той же функции над следующей парой чисел требуется повторное исполнение инструкции, но уже с другой парой операндов.
Такой принцип исполнения естественен для базовой архитектуры процессоров х86. В процессоры Pentium, "под занавес" их развития, было введено расширение ММХ, направленное на ускорение обработки потоков и массивов данных. Ключевым в этом расширении стал принцип SIMD. Здесь вводятся новые упакованные форматы данных: в один регистр ММХ можно помещать не только один операнд (64-битное число), но и пару 32-битных, четверку 16-битных или восьмерку 8-битных чисел. Одна инструкция MMX выполняет однотипные действия сразу над всеми числами, упакованными в регистры ММХ, заданные операндной частью данной инструкции. Поначалу набор инструкций ММХ ограничивался целочисленной арифметикой и логикой, и он стал стандартом для всех современных процессоров х86. Позже появились расширения 3DNow! (от AMD) и SSE (от Intel) для чисел в формате с плавающей точкой, сильно различающиеся по набору инструкций.
Несколько слов о числах с плавающей точкой. Архитектура процессора 8086 позволяет выполнять арифметические функции (сложение, вычитание, умножение и деление) над целочисленными данными (знаковыми и беззнаковыми, двоичными и двоично-десятичными) разрядностью 8 или 16 бит. В процессорах 386+ можно обрабатывать и 32-разрядные числа. Для работы с числами в формате с плавающей точкой (представленными в виде мантиссы и порядка) предусмотрен математический сопроцессор.
Сопроцессор представляет собой набор 80-битных регистров и специализированное арифметическое устройство, которое кроме четырех арифметических действий способно вычислять значение квадратного корня, тригонометрических функций, логарифмов и степеней чисел. Сопроцессор может только перехватывать адресованные ему инструкции из потока команд, выполняемых центральным процессором. Все манипуляции с памятью выполняет центральный процессор. Сложные функции сопроцессора требуют довольно больших затрат времени, но во время их выполнения центральный процессор может продолжать выполнение инструкций, вплоть до момента появления следующей инструкции, адресованной сопроцессору. Однако эта эпизодическая параллельность вычислений не противоречит принципу последовательной передачи управления (самостоятельно сопроцессор передать управление не способен). При отсутствии сопроцессора его функции можно выполнять программно целочисленными средствами центрального процессора, но сопроцессор их выполняет в сотни и тысячи раз быстрее. Программная эмуляция сопроцессора может включаться прозрачно для прикладных программ, обращающихся к сопроцессору. Для этого используется механизм исключений.