Intel i860: Архитектура и особенности микропроцессора
Intel i860
Intel i860: обзор первого в мире миллионного транзисторного чипа. RISC-архитектура 1989 года, предшественник современных процессоров. Неудачный проект.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Intel i860 (также известный как 80860) — это RISC-микропроцессор, разработанный компанией Intel в 1989 году. Он стал одной из первых попыток Intel создать совершенно новую архитектуру набора команд высокого класса после неудачной разработки Intel iAPX 432 начала 1980-х годов. Это был первый в мире чип, содержащий миллион транзисторов. Его выпуск сопровождался значительным ажиотажем, что несколько затмило более ранний Intel i960, который добился успеха в некоторых областях встраиваемых систем. i860 так и не достиг коммерческого успеха, и проект был закрыт в середине 1990-х годов.
Microprocessor design by Intel
The Intel i860 (also known as 80860) is a RISC microprocessor design introduced by Intel in 1989. It is one of Intel's first attempts at an entirely new, high end instruction set architecture since the failed Intel iAPX 432 from the beginning of the 1980s. It was the world's first million transistor chip. It was released with considerable fanfare, slightly obscuring the earlier Intel i960, which was successful in some niches of embedded systems. The i860 never achieved commercial success and the project was terminated in the mid 1990s.
Реализация
Первой реализацией архитектуры i860 стал микропроцессор i860 XR (кодовое название N10), работавший на частоте 25, 33 или 40 МГц. Микропроцессор второго поколения i860 XP (кодовое название N11) получил поддержку 4-мегабайтных страниц, увеличенные кэш-памяти на кристалле, поддержку кэша второго уровня, более быструю шину и аппаратную поддержку перехвата шины для обеспечения согласованности кэша в многопроцессорных системах. Уменьшение техпроцесса для XP (с 1 мкм до 0,8 CHMOS V) позволило увеличить тактовую частоту до 40 и 50 МГц. Оба микропроцессора поддерживали один и тот же набор инструкций для прикладных программ.
The first implementation of the i860 architecture is the i860 XR microprocessor (code named N10), which ran at 25, 33, or 40 MHz. The second generation i860 XP microprocessor (code named N11) added 4 Mbyte pages, larger on chip caches, second level cache support, faster buses, and hardware support for bus snooping, for cache consistency in multiprocessor systems. A process shrink for the XP (from 1 μm to 0.8 CHMOS V) increased the clock to 40 and 50 MHz. Both microprocessors supported the same instruction set for application programs.
Технические особенности
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-битные пиксели.
The i860 combined a number of features that were unique at the time, most notably its very long instruction word (VLIW) architecture and powerful support for high speed floating point operations. The design uses two classes of instructions: "core" instructions which use a 32 bit ALU, and "floating point or graphics" instructions which operate on a floating point adder, a floating point multiplier, or a 64 bit integer graphics unit. The system had separate pipelines for the ALU, floating point adder, floating point multiplier, and graphics unit. It can fetch and decode one "core" instruction and one "floating point or graphics" instruction per clock. When using dual operation floating point instructions (which transfer values between subsequent dual operation instructions), it is able to execute up to three operations (one ALU, one floating point multiply, and one floating point add or subtract) per clock. All of the data buses were at least 64 bits wide. The internal memory bus to the cache, for instance, was 128 bits wide. The "core" class instructions use thirty two 32 bit integer registers. But the "floating point or graphics" instructions use a register file that can be accessed by the floating point units as either thirty two 32 bit, sixteen 64 bit, or eight 128 bit floating point registers, or that can be accessed by the graphics unit as sixteen 64 bit integer registers. The "core" unit is responsible for fetching instructions, and in the normal "single instruction" mode can fetch one 32 bit "core" or one 32 bit "floating point or graphics" instruction per cycle. But when executing in dual instruction mode, the instruction cache is accessed as VLIW instructions consisting of a 32 bit "core" instruction paired with a 32 bit "floating point or graphics" instruction, simultaneously fetched together over a 64 bit bus. Intel i860 instructions acted on data sizes from 8 bit through 128 bit. The graphics supports SIMD like instructions in addition to basic 64 bit integer math. For instance, its 64 bit integer datapath can represent multiple pixels together as either 8 bit pixels, 16 bit pixels, or 32 bit pixels.
Выступление
На бумаге производительность была впечатляющей для однокристального решения, однако реальная производительность оказалась далека от ожидаемой. Одна из проблем, возможно, не осознанная в то время, заключалась в том, что траектории выполнения кода сложно предсказать, что делает чрезвычайно сложной правильную упорядоченность инструкций на этапе компиляции. Например, выполнение инструкции сложения двух чисел займет значительно больше времени, если эти числа отсутствуют в кэше, однако программист не имеет возможности узнать, находятся ли они там или нет. В случае неверного предположения, весь конвейер заблокируется в ожидании данных. Вся конструкция i860 была основана на эффективной обработке этой задачи компилятором, что оказалось практически невозможным. Хотя теоретически процессор мог достигать пиковой производительности в 60–80 МФЛОП как для одинарной, так и для двойной точности в версиях XP, вручную написанный ассемблерный код выдавал лишь около 40 МФЛОП, а большинству компиляторов не удавалось достичь даже 10 МФЛОП. Более поздняя архитектура Itanium, также основанная на VLIW, вновь столкнулась с проблемой компиляторов, не способных генерировать достаточно оптимизированный код. Другой серьезной проблемой было отсутствие эффективного механизма для быстрого переключения контекста. i860 имел несколько конвейеров (для ALU и FPU), и прерывание могло привести к их очистке и необходимости полной перезагрузки. Это занимало 62 цикла в лучшем случае и почти 2000 циклов в худшем. Последнее – это 1/20000 секунды при 40 МГц (50 микросекунд), что является огромным временем для процессора. Это практически исключило i860 из использования в качестве универсального процессора.
On paper, performance was impressive for a single chip solution; however, real world performance was anything but. One problem, perhaps unrecognized at the time, was that runtime code paths are difficult to predict, meaning that it becomes exceedingly difficult to order instructions properly at compile time. For instance, an instruction to add two numbers will take considerably longer if those numbers are not in the cache, yet there is no way for the programmer to know if they are or not. If an incorrect guess is made, the entire pipeline will stall, waiting for the data. The entire i860 design was based on the compiler efficiently handling this task, which proved almost impossible in practice. While theoretically capable of peaking at about 60 80 MFLOPS for both single precision and double precision for the XP versions, manually written assembler code managed to get only about up to 40 MFLOPS, and most compilers had difficulty getting even 10 MFLOPs. The later Itanium architecture, also a VLIW design, suffered again from the problem of compilers incapable of delivering sufficiently optimized code. Another serious problem was the lack of any solution to handle context switching quickly. The i860 had several pipelines (for the ALU and FPU parts) and an interrupt could spill them and require them all to be re loaded. This took 62 cycles in the best case, and almost 2000 cycles in the worst. The latter is 1/20000th of a second at 40 MHz (50 microseconds), an eternity for a CPU. This largely eliminated the i860 as a general purpose CPU.