Скачать 97.27 Kb.
|
использованием основных языков платформы .NET1 C.Б. Березин (s_berezin@cs.msu.su) Московский государственный университет им. М.В. Ломоносова Факультет вычислительной математики и кибернетики 1. Введение. Большинство современных интерактивных графических приложений основано на использовании специализированных графических процессоров (GPU) для обработки полигональной графики. Общая схема работы GPU может быть представлена при помощи модели графического конвейера (рис. 1). ![]() Рис. 1. Программируемый графический конвейер. Почти все современные графические процессоры являются программируемыми и поддерживают два типа программ: вершинные программы (или вершинные шейдеры), определяющие последовательность операций для преобразования координат и атрибутов вершин объектов, и фрагментные программы (пиксельные шейдеры), вычисляющие цвет каждого пикселя. Применение шейдеров позволяет в реальном времени создавать сложные визуальные эффекты, включающие нетривиальный расчет освещения для каждого пикселя, имитацию неровных поверхностей при помощи карт нормалей, моделирование отражающих и преломляющих объектов, расчет динамических теней и объемного тумана и многие другие эффекты, доступные ранее только для алгоритмов трассировки лучей (рис. 2-4). Производительность современных графических процессоров часто оказывается сравнимой с производительностью центрального процессора. Сейчас рассматривается возможность расчета на GPU задач не связанных непосредственно с компьютерной графикой [1].
Рис. 2-4. Визуальные эффекты с применением шейдеров. 2. Постановка задачи. Языки для программирования шейдеров можно разделить на низкоуровневые и высокоуровневые. К низкоуровневым языкам можно отнести языки вершинных и пиксельных шейдеров Direct3D [2] и языки, определяемые расширениями OpenGL ARB_vertex_program и ARB_fragment_program. Для каждого языка определена своя архитектура абстрактной регистровой машины. Все архитектуры обладают рядом общих свойств:
Компиляцию, загрузку и выполнение шейдерной программы на низкоуровневом языке выполняют графическая библиотека и драйвер видеокарты. При использовании низкоуровневых языков возникают следующие неудобства, часть из которых характерна для всех языков ассемблера:
К высокоуровневым языкам можно отнести Microsoft High Level Shader Language [3], NVidia CG [4-6] и OpenGL 2.0 Shader Languages. Все высокоуровневые языки являются процедурными и обычно транслируются в один из низкоуровневых языков. Часть ограничений, связанных с низкоуровневостью языков снимается, но прикладная программа по прежднему должна загрузить шейдерную программу из файла, задать значения используемых в шейдерной программе констант и, возможно, связать шейдерную программу с графическим процессором. Для устранения указанных выше недостатков предлагается разработать транслятор из промежуточного языка Microsoft IL в низкоуровневый язык шейдеров (в качестве целевого языка рассматривается язык шейдеров Direct3D). Применение такого транслятора дает следующие преимущества:
3. Характеристика исходной и целевой платформ. Библиотека Direct3D поддерживает несколько версий языков шейдеров. Основные различия заключаются в поддержке инструкций ветвления, ограничениях на максимальну длину программы и количество регистров. Характеристики этих версий сведены в следующих таблицах.
Таблица 1. Версии вершинных шейдеров Direct3D.
Таблица 2. Версии пиксельных шейдеров Direct3D. Исходный язык Microsoft IL [7] является языком абстрактной стековой машины, содержащим достаточно высокоуровневые инструкции для создания объектов, вызовов методов объектов и обработки исключительных ситуаций. Для вычислений используется стек, предусмотрены специальные инструкции для работы с локальными переменными. Возможности языка Microsoft IL значительно шире возможностей шейдерных языков. Чтобы трансляция стала возможной, набор поддерживаемых инструкций ограничивается следующим образом:
Перечисленные выше ограничения с одной стороны делают задачу трансляции MSIL в языки шейдеров разрешимой на практике, с другой стороны не сильно ограничивают возможности программиста по написанию шейдеров. 4. Методы решения. Задачу трансляции MSIL в язык шейдеров предлагается решать в два этапа. Сначала производится перевод кода MSIL в промежуточное представление, что может быть сделано один раз при первом обращении к коду шейдера. Затем промежуточное представление транслируется в требуемую версию шейдерного языка. На этапе трансляции в промежуточное представление выполняются следующие действия:
Предлагается использовать два промежуточных представления. Шейдерная программа без инструкций ветвления может быть представлена в виде графа зависимостей выходных и входных параметров (рис. 8). Такое представление должно позволить разпределить временные регистры наиболее эффективно, что является немаловажным при трансляции в шейдерные языки младших версий. Второе представление является кодом абстрактной трехадресной машины с неограниченным количеством временных регистров. Методы для трансляции стековой архитектуры в регистровую могут быть разработаны на основе применяемых в существующих JIT компиляторах [8-10]. Отсутствие стековой памяти компенсируется неограниченным количеством временных регистров. Основной задачей при трансляции промежуточного представления в целевой язык является задача распределения ограниченного количества регистров. Общая постановка задачи распределения регистров и некоторые методы решения можно найти в [11-14].Помимо основной задачи перевода MSIL 7. Пример шейдерной программыРассмотрим в качестве примера реализацию смешения матриц (matrix blending). Основная идея такова: каждой вершине объекта присваивается вес ![]() ![]() ![]() На рис. показаны результаты смешения матриц, где в качестве объекта взят куб, веса вершин которого линейно увеличиваются от 0 до 1 вдоло оси OY (все отмечен на рис. цветом), а в качестве матриц M1 и M2 взяты матрицы вращения вокрук оси OY на противоположные углы.
Рис. 5-7. Изменение геометрии при помощи смешения матрицы Необходимо отметить, что искажение формы объекта происходит без изменения исходных геометрического описание объекта, что позволяет значительно сократить объем передаваемых данных и увеличить производительность программы. Описание этого шейдера на языке C# и входных и выходных типов выглядит следующим образом:
Листинг 1. Вершинный шейдер на языке С#
Листинг 2. Представление кода для трехадресной регистровой машины ![]() Рис. 8. Промежуточное представление в виде графа зависимостей.
Листинг 3. Вершинный шейдер на языке Direct3D 8. References. 1. www.gpgpu.org 2. DirectX programming pipeline: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/programmingguide/Programmable/PixelShaders/PixelShaders.asp 3. High Level Shader Language: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/HighLevelLanguageShaders.asp 4. NVidia CG language home page: http://www.cgshaders.org/ 5. William R. Mark, R. Steven Glanville, Kurt Akeley, Mark J. Kilgard. CG: A system for programming graphics hardware in C-like language. 6. www.cgshaders.org 7. Serge Lidin. Inside Microsoft .NET IL Assembler, Microsoft Press 2002 8. Byung-Sun Yang et al, "LaTTe: A Java VM Just-in-Time Compiler with Fast and Efficient Register Allocation," Proceedings of the 1999. 9. Ali-Reza Adl-Tabatabai, Michal Cierniak, Guei-Yuan Lueh, Vishesh M. Parikh, and James M. Stichnoth. Fast, effective code generation in a just-in-time Java compiler. In PLDI '98: Proceedings of the ACM SIGPLAN '98 Conference on Programming Language Design and Implementation, pages 280-290, Montreal, 1998. ACM. 10. Andreas Krall. Efficient JavaVM just-in-time compilation. In Proceedings of the 1998 International Conference on Parallel Architectures and Compilation Techniques, Paris, France, October 1998. 11. А. Ахо, Д. Ульман, Р. Сети. Компиляторы: принципы, технологии и инструментарий, Вильямс 2001. 12. В.А. Серебряков. Лекции по конструированию компиляторов: http://www.ergeal.ru/archive/cs/cc.htm 13. G. J. Chaitin. Register allocation & spilling via graph coloring. Proceedings of the 1982 SIGPLAN symposium on Compiler construction. 14. M. Poletto. Linear scan register allocation. ACM Transcations on Programming Languages and Systems, Vol. 21 No. 5. 1Работа над проектом ведется при финансовой поддержке Microsoft Research. |
![]() | М. Е. Жуковский, Р. В. Усков о применении графических процессоров видеоускорителей в прикладных задачах В работе рассмотрены основы применения технологии nVidia© cuda для распараллеливания вычислений с использованием графических процессоров.... | ![]() | И. И. Шагурин архитектура, программирование и применение Однако в последующих разработках risc-процессоров набор команд значительно расширен, включая команды обработки чисел с плавающей... |
![]() | Архитектура платформы. Net framework 6 | ![]() | Аппаратное ускорение алгоритмов решения уравнений газовой динамики с применением графических процессоров |
![]() | Лекция Visual Studio. Net, Framework. Net Бренд. Net. Visual Studio. Net – открытая среда разработки. Каркас Framework. Net. Библиотека классов fcl – статический компонент... | ![]() | Кафедра информационной безопасности Специальность «Организация и технология защиты информации» Программирование многоядерных процессоров. Библиотека omp и ее использование в С++ и fortran |
![]() | Российской Федерации Государственное образовательное учреждение высшего профессионального образования «Магнитогорский государственный университет» «Государственного образовательного стандарта впо специальность 010501 Прикладная математика и информатика» предусматривает изучение... | ![]() | Development Visual Studio. Net – asp. Net, C#, vb. Net |
![]() | Литература по курсам "Программирование на языке высокого уровня" и «Программирование и основы алгоритмизации» Перевезенцева Е. С., Перевезенцев А. А. Технология решения задач с использованием компьютера: Учебное пособие по курсу "Программирование... | ![]() | Лабораторная работа №6 Итоговое задание «Логическое программирование на языке Visual Prolog» Получить практические навыки применения систем и языков логического программирования для построения систем, основанных на знаниях.... |