Программирование современных графических процессоров с использованием основных языков платформы. Net




Скачать 97.27 Kb.
НазваниеПрограммирование современных графических процессоров с использованием основных языков платформы. Net
Дата26.09.2012
Размер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). Применение такого транслятора дает следующие преимущества:

  • Становится возможным использование многих языков программрования, компиляторов и другого инструментария разработчика на платформе .NET для программирования современных GPU.

  • Написание шейдеров на языке C# должно упростить исходный код в частности и общее управление проектом в целом.

  • Транслятор MSIL в языки шейдеров может оказаться полезным при создании высокоуровневой объектно-ориентированной модели графического конвейера, которая может быть запрограммирована целиком на языке C# или другом языке платформы .NET.


3. Характеристика исходной и целевой платформ.


Библиотека Direct3D поддерживает несколько версий языков шейдеров. Основные различия заключаются в поддержке инструкций ветвления, ограничениях на максимальну длину программы и количество регистров. Характеристики этих версий сведены в следующих таблицах.


vs_1_1

Максимум 128 инструкций; нет инструкций ветвления; 12 временных регистров; 96 константных регистров.

vs_2_0

Максимум 256 инструкций; статические инструкции ветвления; 12 временных регистров; 256 константных регистров.

vs_2_x, vs_3_0

Не менее 512 инструкций; динамические инструкции ветвления; 12 временных регистров; 256 константных регистров.


Таблица 1. Версии вершинных шейдеров Direct3D.


ps_1_1 – ps_1_4

Максимум 14 инструкций; нет инструкций ветвления; 6 временных регистров; 8 константных регистров.

ps_2_0

Максимум 96 инструкций; статические инструкции ветвления; 12 временных регистров; 32 константных регистров.

ps_3_0

Не менее 512 инструкций; динамические инструкции ветвления; 32 временных регистров; 256 константных регистров.


Таблица 2. Версии пиксельных шейдеров Direct3D.


Исходный язык Microsoft IL [7] является языком абстрактной стековой машины, содержащим достаточно высокоуровневые инструкции для создания объектов, вызовов методов объектов и обработки исключительных ситуаций. Для вычислений используется стек, предусмотрены специальные инструкции для работы с локальными переменными.


Возможности языка Microsoft IL значительно шире возможностей шейдерных языков. Чтобы трансляция стала возможной, набор поддерживаемых инструкций ограничивается следующим образом:

  • Не поддерживаются инструкции обработки исключений.

  • Ограничены возможности инструкции вызова (нет виртуальных вызовов, поддерживаются либо вызовы методов из заранее определенного подмножества, либо вызовы, которые могут быть развернуты при помощи макроподстановки).

  • Набор используемых типов ограничен встроенными целочисленными и вещественными типами, а также структурами для представления векторов и матриц размерностью 3 и 4.

Перечисленные выше ограничения с одной стороны делают задачу трансляции MSIL в языки шейдеров разрешимой на практике, с другой стороны не сильно ограничивают возможности программиста по написанию шейдеров.


4. Методы решения.


Задачу трансляции MSIL в язык шейдеров предлагается решать в два этапа. Сначала производится перевод кода MSIL в промежуточное представление, что может быть сделано один раз при первом обращении к коду шейдера. Затем промежуточное представление транслируется в требуемую версию шейдерного языка. На этапе трансляции в промежуточное представление выполняются следующие действия:

  • Проверяется наличие неподдерживаемых инструкций.

  • Вызовы методов или заменяются на векторные и математические операции иди разворачиваются при помощи макроподстановки.

  • Особым образом помечаются входные регистры, выходные регистры и константные параметры.


Предлагается использовать два промежуточных представления.


Шейдерная программа без инструкций ветвления может быть представлена в виде графа зависимостей выходных и входных параметров (рис. 8). Такое представление должно позволить разпределить временные регистры наиболее эффективно, что является немаловажным при трансляции в шейдерные языки младших версий.


Второе представление является кодом абстрактной трехадресной машины с неограниченным количеством временных регистров. Методы для трансляции стековой архитектуры в регистровую могут быть разработаны на основе применяемых в существующих JIT компиляторах [8-10]. Отсутствие стековой памяти компенсируется неограниченным количеством временных регистров.

Основной задачей при трансляции промежуточного представления в целевой язык является задача распределения ограниченного количества регистров. Общая постановка задачи распределения регистров и некоторые методы решения можно найти в [11-14].




Помимо основной задачи перевода MSIL

7. Пример шейдерной программы



Рассмотрим в качестве примера реализацию смешения матриц (matrix blending). Основная идея такова: каждой вершине объекта присваивается вес . Задаются две матрицы преобразования и . Преобразованные координаты vi вычисляются по формуле vi = M1*a + M2*(1 – a). Таким образом, на часть точек объекта болшее влияние оказываетм матрица M1, на другую часть M2. Плавное изменение веса вдоль объекта позволяет выполнять достаточно сложные анимации.


На рис. показаны результаты смешения матриц, где в качестве объекта взят куб, веса вершин которого линейно увеличиваются от 0 до 1 вдоло оси OY (все отмечен на рис. цветом), а в качестве матриц M1 и M2 взяты матрицы вращения вокрук оси OY на противоположные углы.









Рис. 5-7. Изменение геометрии при помощи смешения матрицы


Необходимо отметить, что искажение формы объекта происходит без изменения исходных геометрического описание объекта, что позволяет значительно сократить объем передаваемых данных и увеличить производительность программы.


Описание этого шейдера на языке C# и входных и выходных типов выглядит следующим образом:



[StructLayout(LayoutKind.Sequential)]

public struct WeightedVertex { // Исходная информация о вершине

[Position(0)] // Для автоматического создания VertexDeclaration

public Vector3 Position;

[BlendWeight(0)]

public float Weight;

}


public struct V2F { // Данные для пиксельной программы

[Position] // Эти атрибуты задают выходные регистры

public Vector4 Position;

[Color]

public Vector4 Color;

}


class BlendShader : VertexShader {

public Matrix Trasnform1; // Входные параметры шейдера

public Matrix Transform2; // (константы в терминах Direct3D)


public V2F Main(WeightedVertex in) { // Код шейдера

V2F result = new V2F();

result.Color = new

Vector4(in.Weight,in.Weight,in.Weight,in.Weight);

result.Position =

Transform1*in.Position*in.Weight +

Transform2*in.Position*(1 - in.Weight);

return result;

}

}


Листинг 1. Вершинный шейдер на языке С#



out.color = vector4(in.weight,in.weight,in.weight,in.weight)

t0 = const.transform1 * in.position;

t0 = t0 * in.weight;

t1 = const.transform2 * in.position;

t2 = vector4(1 – in.weight, 1 – in.weight, 1 – in.weight, 1 – in.weight)

out.position = t1 + t2;



Листинг 2. Представление кода для трехадресной регистровой машины





Рис. 8. Промежуточное представление в виде графа зависимостей.



vs_1_1


; Constants:

; c0-c3 - Transform1 + View + Projection matrix

; c4-c7 - Transform2 + View + Projection matrix

; c8 -vector (1,1,1,1)


dcl_position v0

dcl_blendweight v1


mov r0.x, v0.x ; Decompress position into r0

mov r0.y, v0.y

mov r0.z, v0.z

mov r0.w, v0.w


dp4 r1.x, r0, c0 ; Transform position by first matrix -> r1

dp4 r1.y, r0, c1

dp4 r1.z, r0, c2

dp4 r1.w, r0, c3


dp4 r2.x, r0, c4 ; Transform position by second matrix -> r2

dp4 r2.y, r0, c5

dp4 r2.z, r0, c6

dp4 r2.w, r0, c7


mov r3.x,v1.x ; Unpack weight into r3

mov r3.y,v1.x

mov r3.z,v1.x

mov r3.w,v1.x


mov oD0,r3 ; Записываем цвет вершины


mul r1,r1,r3 ; Blend two positions together


sub r3,c8,r3

mad oPos,r2,r3,r1 ; Записываем координаты преобразованной вершины



Листинг 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.

Похожие:

Программирование современных графических процессоров с использованием основных языков платформы. Net iconМ. Е. Жуковский, Р. В. Усков о применении графических процессоров видеоускорителей в прикладных задачах
В работе рассмотрены основы применения технологии nVidia© cuda для распараллеливания вычислений с использованием графических процессоров....
Программирование современных графических процессоров с использованием основных языков платформы. Net iconИ. И. Шагурин архитектура, программирование и применение
Однако в последующих разработках risc-процессоров набор команд значительно расширен, включая команды обработки чисел с плавающей...
Программирование современных графических процессоров с использованием основных языков платформы. Net iconАрхитектура платформы. Net framework 6

Программирование современных графических процессоров с использованием основных языков платформы. Net iconАппаратное ускорение алгоритмов решения уравнений газовой динамики с применением графических процессоров

Программирование современных графических процессоров с использованием основных языков платформы. Net iconЛекция Visual Studio. Net, Framework. Net
Бренд. Net. Visual Studio. Net – открытая среда разработки. Каркас Framework. Net. Библиотека классов fcl – статический компонент...
Программирование современных графических процессоров с использованием основных языков платформы. Net iconКафедра информационной безопасности Специальность «Организация и технология защиты информации»
Программирование многоядерных процессоров. Библиотека omp и ее использование в С++ и fortran
Программирование современных графических процессоров с использованием основных языков платформы. Net iconРоссийской Федерации Государственное образовательное учреждение высшего профессионального образования «Магнитогорский государственный университет»
«Государственного образовательного стандарта впо специальность 010501 Прикладная математика и информатика» предусматривает изучение...
Программирование современных графических процессоров с использованием основных языков платформы. Net iconDevelopment Visual Studio. Net – asp. Net, C#, vb. Net

Программирование современных графических процессоров с использованием основных языков платформы. Net iconЛитература по курсам "Программирование на языке высокого уровня" и «Программирование и основы алгоритмизации»
Перевезенцева Е. С., Перевезенцев А. А. Технология решения задач с использованием компьютера: Учебное пособие по курсу "Программирование...
Программирование современных графических процессоров с использованием основных языков платформы. Net iconЛабораторная работа №6 Итоговое задание «Логическое программирование на языке Visual Prolog»
Получить практические навыки применения систем и языков логического программирования для построения систем, основанных на знаниях....
Разместите кнопку на своём сайте:
Библиотека


База данных защищена авторским правом ©lib.znate.ru 2014
обратиться к администрации
Библиотека
Главная страница