Onloaded Shadows: перенос обработки теневых карт с графического на центральный процессор

Создать новую статью

retweet
27.12.2010 12:00


Скачать статью и посетить домашнюю страницу Onloaded Shadows

Скачать статью Onloaded Shadows: Moving Shadow Map Generation from the GPU to the CPU [Eng., PDF 525KB]
Домашняя страница Onloaded Shadows (исходный код, исполняемые файлы, видео)

Введение

Во многих приложениях источник света (например, солнце) передвигается очень медленно. Фактически, это означает, что генерация карт теней для статических объектов может выполняться не каждый фрейм. Более того, тени могут генерироваться асинхронно по отношению к рендерингу кадров: всего несколько раз в секунду или даже реже. Хотя эту работу можно распределить между несколькими фреймами, обрабатываемыми на GPU, при этом всё равно получается синхронный процесс. С помощью программного растеризатора Microsoft Windows Advanced Rasterization Platform (WARP)1 эту работу можно осуществлять асинхронно на центральном процессоре. Таким образом, единственным синхронным процессом является копирование соответствующих данных c центрального процессора на графический. В нашей программе задача копирования распределена между несколькими фреймами, что позволяет сделать уровень издержек еще меньше.

 

Рис. 1: Экран приложения, использующего метод Onloaded Shadows

Рис. 1: Экран приложения, использующего метод Onloaded Shadows

В нашей программе WARP используется для растеризации и генерации карты теней на CPU. По умолчанию, WARP использует все ядра процессора, что приводит к остановкам основного потока из-за нехватки ресурсов. Для нас подобная остановка недопустима, поэтому мы изменяем начальные настройки и будем работать на одном ядре. В результате в Onloaded Shadows используются только два потока.

Алгоритм формирования карты теней

Оригинальный алгоритм каскадных теневых карт (Cascaded Shadow Maps) не применим в нашей программе, так как он не является инвариантным относительно направления. Значительным же преимуществом этого метода является то, что он проводит рендеринг теневой карты только тех областей, которые находятся в пирамиде видимости. Поскольку зрительный фрустум может поворачиваться и двигаться очень быстро, он может пересекать области, не покрытые тенями до того, как генерируется новая каскадная карта. Метод, применяемый в Onloaded Shadows, заключается в том, что каскады центруются относительно точки зрения камеры, что даёт более низкое качество теневых карт, но позволяет использовать некоторые преимущества каскадной архитектуры. Этот метод требует, чтобы камера двигалась медленно относительно сцены, потому что в противном случае камера может захватить области, покрытые каскадом низкого качества до того, как может быть сгенерирована новая карта теней. Для улучшения зрительного восприятия используются карты теней с экспоненциальной вариативностью (Exponential variance shadow maps, EVSM).2

Рис. 2: Экран нашей программы, вид из источника света, подсвечены каскады.

Рис. 2: Экран нашей программы, вид из источника света, подсвечены каскады.

Ближайший каскад генерируется каждый фрейм целиком на GPU, чтобы получать динамические тени для ближайших объектов. В нашем примере можно разрешать расчёт некоторых, всех или никаких каскадов на GPU каждый фрейм, в зависимости от того, насколько близко к наблюдателю располагаются динамические тени. При этом с каждым получаемым таким способом дополнительным каскадом растёт уровень издержек. Как показано в нашем примере, обработки в каждом фрейме ближайшего каскада достаточно для отображения тени динамических объектов каждый раз при приближении камеры.

Обзор метода

Основной поток производит рендеринг сцены с использованием данных карты теней, хранимых на GPU, в то время как поток WARP асинхронно генерирует карту теней. WARP копирует карту теней в буфер сцены и отображает его на субресурс, поскольку, хотя все ресурсы и находятся на центральном процессоре, устройство WARP не может копировать данные напрямую из Render Target-а. Затем GPU обновляет буфер теней данными из субресурса. После завершения копирования данные с субресурса удаляются, и поток WARP получает сигнал начать расчёт новой карты теней.

С другой стороны, можно создать видимость асинхронной генерации карт теней, строя их на GPU через некоторое обозначенное количество фреймов. Этот метод можно использовать для сравнения с методом Onloaded Shadows. В зависимости от того, сколько времени было потрачено на копирование из субресурса (как в Onloaded Shadows) или на синхронную обработку теней (метод GPU), можно сравнивать производительность данных методов.

Значительная часть времени генерации фрейма, уходящая на указанную обработку каждые несколько секунд, будет вызывать заметную задержку в работе и является нежелательной для любого приложения. По этой причине работа, синхронно выполняемая каждые несколько фреймов, разбивается на подзадачи достаточно малые, чтобы оказывать как можно меньший эффект. Такой подход называется Distributed Stall. В методе Onloaded Shadows синхронное копирование легко может быть разбито на части размером вплоть до одного байта, в то время как в методе GPU разделение работы по обработке теней на части становится очень затруднительным. В нашем примере процесс разбивается на обработку каскадов, а затем на начальное рисование тени и на разные проходы по обработке буфера теней. GPU использует два теневых буфера: обновление осуществляется в течении нескольких фреймов, в процессе используются данные из одного буфера и помещаются в другой буфер. При использовании только одного буфера теней во время копирования данных на экране могут возникать заметные артефакты.

Производительность

Мы протестировали производительность вьюпорта с установленным по умолчанию разрешением 1024x768. Во всех случаях использовалось асинхронное обновление карты за период 2000 мс, при этом могли различаться размеры буферов, количество каскадов, а также количество каскадов, синхронно запускаемых каждый фрейм на GPU. Например, 1408x4+1 означает, что используются 4 каскада разрешением 1408x1408, и 1 каскад синхронно обрабатывается каждый фрейм на GPU.

Тестирования проводились на четырех разных компьютерах, для получения более достоверных данных для сравнения методов Onloaded Technique и ложного асинхронного GPU. Машины, маркированные 'SNB GT1' и 'SNB GT2', основаны на микроархитектуре с кодовым именем Sandy Bridge с процессором 2.2ГГц и 4ГБ памяти. Машина, отмеченная 'FX 770M', имеет графическую карту NVIDIA Quadro* FX 770M, двухъядерный процессор 2.8ГГц и 4ГБ памяти. Машина, отмеченная 'HD 5870', имеет дискретную графическую карту ATI Radeon* HD 5870, двухъядерный процессор 3.2 ГГц и 3ГБ памяти. На всех компьютерах была установлена ОС Microsoft Windows* 7.

Мы собирали данные о пиках времени генерации фрейма, приходящихся на остановки в моменты проведения синхронной работы. В случае распределённого останова время работы распределено между несколькими фреймами, и выбираемый фрейм представляет максимальный промежуток. Приведенные данные не включают в себя стандартное время генерации кадра без пика – это время эквивалентно для всех фреймов и не включено в рассматриваемые данные. По этой причине время фрейма у нас может приближаться к нулю.

На машинах на основе микроархитектуры с кодовым именем Sandy Bridge – целевой платформе для алгоритма Onloaded Shadows – пиковое время фрейма было в 2 – 4 раза ниже, чем у метода GPU. При использовании оптимизации распределённого останова пики времени метода GPU были значительно ниже, но всё же заметными, в то время как при методе Onloaded эти издержки были практически сведены к нулю. При работе на процессорной графике Intel метод Onloaded Shadows является самым быстрым при асинхронном расчёте теней – с или без оптимизации распределённого останова.

На графической платформе NVIDIA Quadro* FX 770M метод Onloaded Shadows создаёт больший объём издержек, чем метод GPU. Это и ожидалось, потому что каждый раз приходится копировать данные из процессора на дискретную графическую карту, что значительно медленнее, чем если бы весь процесс проходил на одном чипе. Однако если используется оптимизация распределённого останова, то метод Onloaded Shadows работает быстрее при любом раскладе, приближаясь по времени к пренебрежимо малым величинам.

На графической платформе ATI Radeon* HD 5870 метод GPU во всех аспектах работает намного быстрее, чем Onloaded Shadows. GPU при обработке теневых карт работает значительно быстрее, а издержки при копировании данных из CPU на дискретную графическую карту никуда не исчезают. Это показывает, что наш метод не является универсальным для всех новейших дискретных графических карт.

Нужно отметить, что Onloaded Shadows имеет ещё одно преимущество, не очевидное при работе с рассматриваемыми нами данными. Он является гораздо более последовательным алгоритмически, чем метод GPU. Поскольку выполняемые синхронные действия заключаются только в операциях копирования, то объём издержек не меняется, пока размер буферов и число каскадов остаётся прежним. Что касается метода GPU, то графический процессор пишет в буфер теней и затем проводит разнообразную постобработку этого буфера, что означает, что скорость сильно зависит от положения камеры и текущей сложности сцены. Поскольку эти параметры могут существенно меняться в процессе игры, то и пики времени фрейма могут сильно различаться, и их будет трудно распределить равномерно при использовании оптимизации распределённого останова.

Если архитектура WARP когда-нибудь в будущем будет поддерживать многопоточность без угрозы остановки основного потока, то наш пример значительно выиграет. Тестирование WARP с включёнными потоками и игнорированием остановок на процессоре Intel® Core™ i7 продемонстрировало, что генерацию карты теней на CPU можно теоретически ускорить на 300%, снизив необходимое время работы с 600 мс до 200 мс.

Перспективы проекта

Существуют разные способы улучшить Onloaded Shadows. Во-первых, программный растеризатор WARP не рассчитан на максимальную скорость работы. Скорее, он был создан для максимальной эмуляции графического оборудования. Результаты его работы оставляют желать лучшего, и использование оптимизированного программного растеризатора могло бы существенно улучшить производительность.

Во-вторых, потенциальной проблемой остаётся быстрое перемещение зрительного фрустума. Если фрустум двигается достаточно быстро, то зритель может заметить появляющиеся на долю секунды низкокачественные теневые каскады. Предсказание пути фрустума может помочь в некоторых случаях – например, при полёте по предварительно рассчитанному пути.

Вместо генерации теней всеми силами как можно быстрее, их получение можно реализовать более разумно. Тени можно генерировать, когда свет сдвинулся на определённое расстояние или если камера достаточно передвинулась. Это уменьшит нагрузку на процессор и освободит ресурсы для других задач.

Наконец, метод Onloaded Shadows можно расширить на другие области графики, в которых работа должна выполняться не каждый фрейм, а каждые несколько секунд. Некоторые потенциальные графические технологии, которые могут использовать преимущества данного метода, включают в себя Onloaded Environment Maps, Onloaded Lightmaps и Onloaded Global Illumination.

Заключение

Генерация теневых карт может существенно влиять на скорость рендеринга сцены на GPU. В некоторых случаях карту теней можно рассчитывать асинхронно, а не каждый фрейм, что повышает производительность. В Onloaded Shadows для асинхронной генерации карт теней на центральном процессоре используется WARP. Тестирование показало, что нащ метод расчёта теневых карт на CPU работает значительно быстрее, чем любой другой сравнимый с ним метод, использующий GPU на машинах с интегрированной графикой Intel, а при правильной оптимизации он показывает хорошие результаты и на некоторых дискретных графических картах.

Об авторах

Зэйн Манковски (Zane Mankowski) - практикант в Intel Visual Computing Software Division. В настоящий момент ожидает получения степени бакалавра компьютерных наук в Рочестерском Технологическом Институте.

В данной работе также принимали участие: Стив Смит (Steve Smith), Доуг Бинкс (Doug Binks) и Джефф Эндрюз (Jeff Andrews).

Ссылки / Ресурсы

  1. Glaister, Andy. Windows Advanced Rasterization Platform (WARP) In-Depth Guide. MSDN. 11/08
  2. Tuft, David. Cascaded Shadow Maps. MSDN. 06/10