Растр, лучи и программируемая логика

29 март, 2005 - 23:00Андрей Зубинский Пять кленов, представленных несколькими миллионами треугольников, 28 тыс. подсолнухов одиннадцати различных видов, каждый состоит из 35 тыс. треугольников, и при этом -- расчет с пиксельной точностью теней, отбрасываемых полупрозрачными (точнее, текстурированными полупрозрачными текстурами) листьями. Во всем этом великолепии можно в реальном времени передвигаться, наблюдая виртуальный мир через виртуальную камеру с разрешением 640x480, можно интерактивно "пересаживать" отдельные растения. Это называется не "вам и не снилось". Это -- сегодняшний день технологии трассировки лучей в реальном времени (рис. 1).

Растр, лучи и программируемая логика
Рис. 1
Растр, лучи и программируемая логика
Рис. 2. Прототип аппаратного трассировщика лучей SaarCOR -- платы FPGA-сопроцессора, рассчитанного на использование двух FPGA и цифроаналогового преобразователя, формирующего VGA-сигнал
Но на самом деле принципиальная реализуемость в реальном времени хорошо известного способа визуализации сцен не является главным достоинством трассировки лучей. От более традиционной растеризации -- процедуры, поддерживаемой большинством графических акселераторов современных видеокарт, трассировка лучей отличается фундаментально. Если растеризация основывается на итеративной алгоритмике, в которой в один момент времени обрабатывается один треугольник сцены, то трассировка лучей -- на доступе ко всей сцене сразу. На практике это означает, что для программиста, создающего ПО визуализации в системе, реализующей трассировку лучей, такие традиционно считающиеся весьма сложными задачи, как, например, отрисовка теней и отражений от множественных источников света, становятся тривиальными. Создатели трехмерных сцен реального времени получают также возможность избежать "трюковых" приемов для "апроксимации" идеального трассировщика лучей средствами растеризатора.

Но прежде чем сказать несколько слов о современной реализации аппаратного трассировщика лучей, давайте выслушаем мнение тех, кто пока заинтересован в... классических растеризационных графических подсистемах. Курт Экели из NVidia на вопрос "Приведет ли упрощение и повышение быстродействия аппаратных средств трассировки лучей к вытеснению ими традиционных растеризаторов?" отвечает кратко и однозначно: "Трассировка лучей станет значимой технологией и выйдет за пределы нишевого рынка только тогда, когда у нее появится мощная поддерживающая аппаратная инфраструктура". Ларри Сейлер из ATI считает, что "трассировка лучей никогда не заменит растеризацию. Обе эти технологии уступят место чему-то новому по трем причинам. Во-первых, два алгоритма (имеются в виду растеризация и трассировка лучей) не решают одну и ту же проблему: если трассировка лучей великолепно подходит для моделирования реального мира, то растеризация как совокупность различных алгоритмов дает лучшие результаты при моделировании объектов, не имеющих аналогов в физической реальности. Во-вторых, полоса пропускания памяти растет намного медленнее, чем производительность вычислителей (а трассировщики лучей очень требовательны именно к полосе пропускания -- Прим. автора). В-третьих, алгоритмика растеризаторов менее чувствительна к задержкам, неизбежно возникающим в процессе обработки больших сцен.

Итак, после отрезвляющего холодного скепсиса представителей двух гигантов современной индустрии графических акселераторов сообщение о том, что на выставке CeBIT 2005 командой разработчиков из университета Саарленд продемонстрирован рабочий прототип аппаратного видеоконтроллера, реализующего трассировку лучей в реальном времени, уже не выглядит сенсационным. И слава Богу -- сенсаций в области аппаратных средств машинной графики было более чем достаточно (и это, естественно, вносило некоторое разнообразие), но мир живет не сенсациями, а плодами реализации технологий. Впрочем, прототип, названный SaarCOR, в отличие от навечно застывших в стадии описания достоинств и так и не овеществившихся видеокарт, действительно работает, причем показывает весьма внушительные для своих скромных параметров значения производительности. Судите сами: реализован SaarCOR на микросхеме программируемой логики FPGA (короткому обзору программируемой логики посвящена вторая часть статьи) семейства Xilinx Virtex-II с немногим более чем 76 тыс. логических ячеек, неполными полутора сотнями аппаратных 18 битных умножителей и двумя с половиной мегабитами памяти. Эти возможности FPGA (далеко не самой быстрой и емкой на сегодняшний день) позволили реализовать в одном кристалле параллельную 64 поточную подсистему трассировки лучей, поддерживающую до 256 источников света, а также интерфейс шины PCI, VGA-интерфейс и аппаратные средства оценки производительности в реальном времени. При этом расходы ресурсов FPGA оказались весьма скромными -- 56% логических ячеек и 78% памяти. Тактовая частота получившейся машины трассировки лучей составила 90 MHz (более развитые современные FPGA позволяют ее существенно увеличить). Для сравнения: чипсет NVidia GeForce 5900FX содержит 125 млн транзисторов, а производительность его четырех сотен вычислителей с плавающей точкой примерно в 50 раз выше, чем суммарная производительность SaarCOR. Эти данные приведены не для противопоставления аппаратной поддержки алгоритмов растеризации и трассировки лучей GeForce и SaarCOR соответственно, а для демонстрации возможностей роста технологии -- все-таки университетская команда исследователей не располагает возможностями R&D-центра промышленного гиганта. А вот есть ли смысл продолжать развивать технологию SaarCOR, можно сказать, сравнив ее производительность с сугубо программной SSE-оптимизированной реализацией трассировщика лучей (система OpenRT), выполняющейся на ПК с процессором Intel Pentium 4 2,66 MHz и объемом оперативной памяти 1 GB. В 30 раз большая, чем в SaarCOR, тактовая частота универсального процессора и SSE-код более чем неплохого трассировщика лучей никаких особых преимуществ программной реализации не дают: даже сцену, содержащую 187 млн треугольников, SaarCOR визуализирует в четыре с лишним раза быстрее -- с частотой 32 кадра в секунду (для особо щепетильных -- при размере кадра 512x384 пиксела, с использованием только главных лучей, с учетом затенения с полным текстурированием). Пожалуй, наиболее интересным свойством SaarCOR стала выявленная его создателями нетребовательность аппаратной реализации к ширине полосы пропускания: при этом показателе, меньшем в 4 раза, чем у NVidia GeForce3, SaarCOR достигает такой же, как у GeForce, производительности, измеренной в частоте кадров в секунду. Если мы вспомним, что говорил специалист ATI Ларри Сейлер о требовательности трассировщиков лучей к полосе пропускания подсистемы памяти, и учтем, что эти слова -- не заблуждение, а мнение специалиста, SaarCOR можно считать исключительно важной разработкой. Хотя бы в том смысле, что, разрушая стереотипы, она дает хорошую отправную точку для поиска того нового, что неизбежно придет на смену сегодняшним графическим подсистемам.


Эволюция "программируемого железа"

Из массы цифровых интегральных микросхем, доступных конструкторам, можно выделить несколько обширных и наиболее общих классов. Базовый (самый низкоуровневый) класс, имеющий жаргонное, но весьма меткое определение "рассыпуха", -- это микросхемы низкой степени интеграции, реализующие сравнительно простые логические функции и характеризующиеся незначительным числом входов/выходов (что эквивалентно и сравнительно небольшому числу "ног" у корпуса микросхемы). Второй уровень -- память. Она бывает нескольких типов. Энергонезависимая (этот термин подчеркивает независимость содержимого от энергии источника питания) по инерции называется постоянной, хотя большинство современных ее вариантов допускают изменение содержимого. Память, одновременно более емкая и дешевая, но характеризующаяся зависимостью содержания не только от энергии источника питания, но и от времени, называется динамической оперативной (для этой зависимости значимое время измеряется миллисекундами, если же говорить о тысячелетиях, то можно смело утверждать, что содержимое всех типов памяти зависит от времени). Самая скромная по емкости память, ярко выделяющаяся высоким быстродействием (и стоимостью за единицу объема) -- статическая оперативная. Ее содержимое зависит от энергии источника питания, но не зависит от времени. Третий класс микросхем -- микропроцессоры и микроконтроллеры, являющиеся, по сути, "упакованной" на одном кристалле комбинацией микросхем трех классов. И наконец, четвертый класс -- микросхемы программируемой логики. Несмотря на то что они появились немного раньше, чем первый микропроцессор, их можно считать более высокоуровневым "строительным узлом" из-за того, что программируемая логика допускает такую же гибкость в построении аппаратных средств, какую микропроцессоры допускают в построении программных (с другой стороны, некоторые современные интегральные микроконтроллеры позиционируются и их производителями, и разработчиками конечных изделий, их использующих, как эффективные заменители... программируемой логики).

Востребованность программируемой логики объясняется постоянным ростом потребности в "нестандартных" или "не совсем стандартных" логических узлах у производителей конечной продукции. "Рассыпуха" в качестве основы для их производства непригодна -- слишком дорогими и неэффективными получаются огромные печатные платы, напичканные низкоуровневыми микросхемами. Конечно, существует так называемая "заказная логика", но она по сей день очень дорогая -- общая стоимость цикла разработки и подготовки к серийному выпуску заказной микросхемы может измеряться семизначными суммами. Следовательно, для того чтобы добиться рентабельности, тираж изделия, использующего такую заказную микросхему, должен быть просто астрономическим. Ведь никто не купит такой эксклюзив, как малосерийный MP3 плеер (вся эксклюзивность которого заключается в "самом передовом" заказном чипе кодека), за 10 тыс. долл.

Первый этап развития программируемой логики можно описать следующей цепочкой аббревиатур: PROM, PLA, PAL, GAL (для этих четырех типов программируемых чипов есть собирательное название SPLD), CPLD. В неспециальных изданиях чаще всего встречается PROM, обозначающая... обычные микросхемы энергонезависимой памяти. И между тем, эти микросхемы позволяют создавать "программируемое железо" -- раз они способны ставить данные в соответствие адресу (то есть некоторому двоичному слову), значит, на их основе можно реализовать различные логические функции. Первоначально технологической основой PROM были массивы электрически пережигаемых микроскопических нихромовых перемычек (fuse, работавших по тому же принципу, что и обычный предохранитель). Следующее поколение PROM, напротив, создавалось на основе реверсивного принципа (что подчеркивается даже названием технологии -- antifuse) -- в поставляемых производителем устройствах перемычки были разомкнуты. Естественно, что здесь слово "перемычки" логично закавычить -- в разомкнутом состоянии они представляют собой микроскопические столбики аморфного кремния, образующие "бутерброд" с металлическими обкладками. При программировании сопротивление такого столбика изменяется с гигаом до тысяч или даже сотен ом -- т. е. металлические обкладки "бутерброда" фактически соединяются. Устройства, выполненные и по fuse-, и по antifuse-технологиям, объединяются собирательным термином "однократно программируемые" -- OTP (One-Time Programmable).

Вторая технологическая фаза в истории -- переход от "простых и грубых" физических принципов формирования "перемычек" к более сложным, позволяющим устранить главный недостаток OTP -- невозможность изменения записанной в микросхему информации. EPROM, или "стираемая доступная только по записи память" (Erasable PROM), основывалась на незначительной модификации интегрального полевого MOS (металл-окисел-полупроводник) транзистора. Первое устройство на основе данной технологии появилось на рынке в 1971 г. (это была микросхема памяти Intel 1702). EPROM позволяла стирать содержимое микросхемы, но требовала для процедуры стирания облучения полупроводникового кристалла ультрафиолетовым излучением. Соответственно, выполненные по EPROM-технологии чипы имеют характерный конструктив корпуса -- с окошком из кварцевого стекла (следует заметить, что такой корпус более чем недешев). Судьба EPROM была предопределена именно потребностью в ультрафиолетовом облучении кристалла: при росте степени интеграции для обеспечения "доставки" ультрафиолетовым излучением к каждому элементу микросхемы требуемого количества энергии "стирания" содержимого приходилось увеличивать и без того немалое время этой процедуры до десятков минут.

На смену однотранзисторной ячейке EPROM пришла двухтранзисторная EEPROM -- электрически стираемая ее вариация. В ней собственно транзистор-"перемычка" не претерпел фундаментальных изменений по сравнению с EPROM, а за счет усложнения здесь добавлена возможность стирать ячейки электрическим сигналом, требуемую энергию которого легко подвести к каждой ячейке. Более распространенная сейчас флэш-технология, по сути, является собирательным названием для дальнейших (и уже совсем незначительных) модификаций EEPROM. По крайней мере, запоминающая ячейка во флэш-памяти и программируемой логике в большинстве случаев осталась почти неизменной двухтранзисторной комбинацией стирающего транзистора и транзистора-"перемычки".

Технологические достижения PROM позволили реализовать первые "логические полуфабрикаты" -- программируемые логические массивы, PLA (Programmable Logic Array). В них "перемычки" использовались для формирования соединений в двух разных наборах интегрированных элементов, реализующих логические функции "И" и "ИЛИ". Важнейшее отличие PLA от PROM заключается в том, что степень сложности и характер реализуемых PLA логических функций не определяется количеством выводов микросхемы. Впоследствии PLA были вытеснены более быстродействующими PAL -- "программируемыми логическими матрицами", в которых программировались соединения только в одном массиве элементов ("И"), соединения же во втором раз и навсегда "зашивались" производителем.

На следующем витке технологической спирали многочисленные элементы вышеназванных простых типов начали соединяться на одном кристалле посредством многобитных шин. Подобные сложные схемы, чтобы подчеркнуть их композитный характер, называют CPLD -- сложными программируемыми логическими устройствами.

Параллельно с программируемой логикой развивалось и направление, родоначальником которого стала уникальная в своем роде "макросхема" Micromatrix, выпущенная компанией Fairchild Semiconductor в середине 60 х годов прошлого века. "Микроматрица" представляла собой "бутерброд" из металлизированных пластиковых пластин, между которыми были заключены порядка сотни обычных дискретных транзисторов. Конструктор, использующий Micromatrix, вручную прорисовывал соединения-дорожки на металлизированных поверхностях этого "бутерброда". В 1967 г. та же Fairchild выпустила Micromosaic -- несколько сотен транзисторов в одной сборке. При этом для разработчиков цифровых схем на основе Micromosaic поставлялась компьютерная программа, генерирующая топологию соединений на основе описания будущего устройства на уровне булевых функций. Micromosaic стала настоящей революцией и открыла новую эпоху -- вентильных матриц (gate arrays) и проектирования электронных схем на их базе с помощью компьютера. Впоследствии вентильные матрицы с микроячейками, не настолько уж и сильно отличающимися от единственного транзистора Micromosaic, стали основой заказных микросхем, позволяющих реализовать очень сложное устройство высокой степени интеграции, но за слишком большие для мало- и среднесерийного производителя деньги и в слишком продолжительные для требований массового рынка сроки. Между CPLD, ограничивающими функциональность программируемых из них устройств, и заказными чипами на базе вентильных матриц образовалась незаполненная, но чрезвычайно привлекательная ниша. Ее заняла компания Xilinx, в 1984 г. выставившая на рынок новый продукт -- программируемую заказчиком в условиях эксплуатации вентильную матрицу, FPGA (Field Programmed Gate Array, причем Field Programmed здесь указывает на то, что FPGA может программироваться "в поле" -- например, непосредственно в законченном устройстве). В отличие от всех предыдущих устройств примитивный элемент FPGA -- аналог "логической ячейки" -- несоизмеримо сложнее. Это программируемый логический блок, способный выполнять ряд задаваемых разработчиком функций.