Введение

Intel i860 (также известный как 80860) — это RISC-микропроцессор, разработанный компанией Intel в 1989 году. Он стал одной из первых попыток Intel создать совершенно новую архитектуру набора команд высокого класса после неудачной разработки Intel iAPX 432 начала 1980-х годов. Это был первый в мире чип, содержащий миллион транзисторов. Его выпуск сопровождался значительным ажиотажем, что несколько затмило более ранний Intel i960, который добился успеха в некоторых областях встраиваемых систем. i860 так и не достиг коммерческого успеха, и проект был закрыт в середине 1990-х годов.

Реализация

Первой реализацией архитектуры i860 стал микропроцессор i860 XR (кодовое название N10), работавший на частоте 25, 33 или 40 МГц. Микропроцессор второго поколения i860 XP (кодовое название N11) получил поддержку 4-мегабайтных страниц, увеличенные кэш-памяти на кристалле, поддержку кэша второго уровня, более быструю шину и аппаратную поддержку перехвата шины для обеспечения согласованности кэша в многопроцессорных системах. Уменьшение техпроцесса для XP (с 1 мкм до 0,8 CHMOS V) позволило увеличить тактовую частоту до 40 и 50 МГц. Оба микропроцессора поддерживали один и тот же набор инструкций для прикладных программ.

Технические особенности

i860 объединял в себе ряд уникальных для того времени особенностей, в частности, архитектуру с очень длинным командным словом (VLIW) и мощную поддержку высокоскоростных операций с плавающей точкой. В конструкции используются два класса инструкций: "основные" инструкции, использующие 32-битный АЛУ, и "инструкции для операций с плавающей точкой или графики", которые работают с сумматором чисел с плавающей точкой, умножителем чисел с плавающей точкой или 64-битным целочисленным графическим блоком. Система имела отдельные конвейеры для АЛУ, сумматора чисел с плавающей точкой, умножителя чисел с плавающей точкой и графического блока. Она может извлекать и декодировать одну "основную" инструкцию и одну "инструкцию для операций с плавающей точкой или графики" за такт. При использовании парных инструкций с плавающей точкой (которые передают значения между последующими парными инструкциями), она способна выполнять до трех операций (один АЛУ, одно умножение с плавающей точкой и одно сложение или вычитание с плавающей точкой) за такт. Все шины данных были не менее 64 бит в ширину. Например, внутренняя шина памяти к кэшу была 128 бит в ширину. "Основные" инструкции используют тридцать два 32-битных целочисленных регистра. Но "инструкции для операций с плавающей точкой или графики" используют файл регистров, к которому блоки операций с плавающей точкой могут обращаться как к тридцати двум 32-битным, шестнадцати 64-битным или восьми 128-битным регистрам с плавающей точкой, или к которому графический блок может обращаться как к шестнадцати 64-битным целочисленным регистрам. "Основной" блок отвечает за извлечение инструкций, и в обычном режиме "одной инструкции" может извлекать одну 32-битную "основную" или одну 32-битную "инструкцию для операций с плавающей точкой или графики" за цикл. Но при выполнении в режиме двойных инструкций к кэшу инструкций обращаются как к VLIW-инструкциям, состоящим из 32-битной "основной" инструкции, объединенной с 32-битной "инструкцией для операций с плавающей точкой или графики", которые одновременно извлекаются вместе по 64-битной шине. Инструкции Intel i860 работали с данными размером от 8 до 128 бит. Графика поддерживает инструкции, подобные SIMD, в дополнение к базовой 64-битной целочисленной математике. Например, ее 64-битный целочисленный канал данных может представлять несколько пикселей вместе как 8-битные пиксели, 16-битные пиксели или 32-битные пиксели.

Выступление

На бумаге производительность была впечатляющей для однокристального решения, однако реальная производительность оказалась далека от ожидаемой. Одна из проблем, возможно, не осознанная в то время, заключалась в том, что траектории выполнения кода сложно предсказать, что делает чрезвычайно сложной правильную упорядоченность инструкций на этапе компиляции. Например, выполнение инструкции сложения двух чисел займет значительно больше времени, если эти числа отсутствуют в кэше, однако программист не имеет возможности узнать, находятся ли они там или нет. В случае неверного предположения, весь конвейер заблокируется в ожидании данных. Вся конструкция i860 была основана на эффективной обработке этой задачи компилятором, что оказалось практически невозможным. Хотя теоретически процессор мог достигать пиковой производительности в 60–80 МФЛОП как для одинарной, так и для двойной точности в версиях XP, вручную написанный ассемблерный код выдавал лишь около 40 МФЛОП, а большинству компиляторов не удавалось достичь даже 10 МФЛОП. Более поздняя архитектура Itanium, также основанная на VLIW, вновь столкнулась с проблемой компиляторов, не способных генерировать достаточно оптимизированный код. Другой серьезной проблемой было отсутствие эффективного механизма для быстрого переключения контекста. i860 имел несколько конвейеров (для ALU и FPU), и прерывание могло привести к их очистке и необходимости полной перезагрузки. Это занимало 62 цикла в лучшем случае и почти 2000 циклов в худшем. Последнее – это 1/20000 секунды при 40 МГц (50 микросекунд), что является огромным временем для процессора. Это практически исключило i860 из использования в качестве универсального процессора.