Масштабируемые амбиентные эффекты

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

Скачать статью Scalable Ambient Effects [Eng., PDF 747KB]
Домашняя страница Fireflies (исходный код, исполняемые файлы, видео)

Introduction

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

Fireflies – это пример приложения, демонстрирующий масштабируемые амбиентные эффекты. В нашем случае тысячи светлячков взлетают, образуя облако, а затем садятся и образуют шагающую фигуру. В примере используется простой искусственный интеллект, включающий в себя функции образования группы и избежения столкновений с землёй и деревьями. Используя параллелизм задач, программа задействует все ядра процессора. Планировщик написан с помощью Intel® Threading Building Blocks (Intel® TBB).
 

Рис. 1: Fireflies в действии

 

Функционал приложения

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

Fireflies поддерживает функцию автоматического масштабирования эффекта. Для этого воспользуйтесь функцией «Auto-Calibrate Optimal Number Particles» и программа рассчитает максимальное количество частиц, которое можно эмулировать при сохранении заданного уровня производительности для данного компьютера. Авто-масштабирование заставляет светлячков летать ближе друг к другу, создавая самый высокий уровень нагрузки на систему. Для повышения вычислительной мощности приложения запускаются дополнительные потоки, количество которых может превышать число логических аппаратных потоков. Этот метод работает благодаря тому, что Intel TBB автоматически распределяет общую нагрузку, а мелкозернистые задачи распределяются планировщиком более равномерно. После установки общего возможного числа задач программа настраивает разные параметры эмулируемых частиц и пытается найти такое их максимальное количество, при котором возможно поддерживать минимальную производительность в 30 фреймов в секунду.

Чтобы наглядно представить, как работает наша программа, запустите исполняемый файл Profile. Версия Profile vсодержит макросы, которые собирают информацию о фреймах и производительности в окне Platform View инструментария Intel® Graphics Performance Analyzers (Intel® GPA).

 

Распределение работы на задачи

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

С другой стороны, при работе программы в многопоточном режиме, расчёт полёта светлячков разбивается на задачи. В этом случае «задача» - это некоторый набор вычислений, относящихся к полёту светлячков,который выполняется на отдельном потоке. Все полётные расчёты не зависят друг от друга и потому могут легко выполняться параллельно. В теории, чем больше задач, тем больший объём полётных расчётов можно выполнять одновременно. На практике параллелизация вычислений ограничена реальным количеством процессорных ядер. Более того, при каждом вызове задачи возникает некоторый объём издержек, поэтому объём работы, содержащийся в каждой задаче, должен превосходить этот объём издержек. Эффективное разделение работы на задачи требует нахождения правильного числа задач, которое даёт максимальную параллельную производительность без возникновения чрезмерного объёма издержек.

На рис. 2 показан график нижних пределов показателя fps для разного количества используемых задач. На иллюстрации видно, что существует максимальное количество частиц, при котором нормально функционирует заданное число задач. Если частиц слишком много, то увеличение количества задач не приносит желаемого эффекта, поскольку вычислительное время тратится на запуск дополнительных тасков без всякой пользы: если нет свободных ядер для обработки дополнительных задач, то объём выполняемых параллельно вычислений не может быть увеличен. Однако при большом количестве частиц распределение вычислений между задачами даёт значительный прирост производительности по сравнению с последовательным выполнением. Как видно на рис. 2, даже при разделении расчётов всего лишь на четыре задачи производительность возросла вдвое. Увеличение количества задач до 12 увеличивает производительность в четыре раза.

В общем, с точки зрения производительности имеет смысл распараллелить данный эффект, чтобы он мог использовать ресурсы многоядерных процессоров. К тому же основанная на задачах потоковая модель Intel TBB позволяет распределять вычисления по всем имеющимся в наличии ядрам. Как видно на рис. 3, параллельная часть приложения показывает практически линейный рост производительности при увеличении числа доступных ядер. Данный график был получен с помощью измерений среднего времени, уходящего на выполнение чисто параллельного участка кода, который состоит в вычислении в каждом фрейме траекторий светлячков. При этом изменялось количество ядер, которые могла использовать программа. 1

 

 

 

 

 

 

 

 

Рис. 2: Количество задач относительно fps при работе на шестиядерном процессоре

 

 

Рис. 3: Среднее время, уходящее на выполнение кода, рассчитывающего траектории полёта светлячков, в зависимости от количества доступных процессорных ядер

 


Кто-то может заметить, что при работе программы с небольшим количеством светлячков, многопоточный режим всё же работает быстрее, чем последовательный. Кроме расчетов траекторий полёта светлячков, ещё одной важной частью кода является та, в которой параллелизм задач используется для постановки и рендеринга фреймов. При последовательной работе происходит обычная постановка фрейма, обработка данных этого фрейма, и затем рендеринг. После распараллеливания обработка полётов светлячков делается в предыдущем фрейме параллельно с рендерингом, что сокращает общее время, необходимое для обработки фрейма. Ниже приведены сравнительные диаграммы выполнения в параллельном и последовательном режимах. На рис. 5 также можно видеть диаграмму активности потока в течение одного фрейма при работе в параллельном режиме, как это показывает Intel® GPA Platform View.

 

 

 

Рис. 4: Диаграммы параллельного и последовательного выполнения в течение одного фрейма показывают, как в многопотоковом режиме распределяются по потокам расчёты и рендеринг

 

 

Рис. 5: Активность потоков в течение фрейма, как показывает Intel® GPA Platform View

 

 

Заключение

Мы привели амбиентный эффект, который можно использовать для улучшения качества компьютерных игр, и продемонстрировали, что распределение вычислений по параллельным потокам с помощью множества задач имеет множество положительных эффектов. Многопоточность не только повышает производительность, но также позволяет амбиентным эффектам легко масштабироваться согласно возможностям процессора при работе на разных платформах. Имея возможность изменять количество задач, выполняющих вычисления, и количество объектов, которые нужно обсчитывать, разработчики могут создавать масштабируемые эффекты, такие как в программе Firefly, только единожды и больше не волноваться за их работу на разных платформах: от Intel® Atom™ в нетбуках вплоть до процессоров высокопроизводительных настольных систем.

 

 

Об авторе

Элиезер Пэйзер (Eliezer Payzer) проходит стажировку в отделе Intel Visual Computing Software Division, где работает над программами, демонстрирующими возможности архитектуры Intel. Он ожидает получения степени магистра компьютерных наук в Университете Южной Калифорнии.

1Данные были получены на компьютере с процессором Intel® Core™ i7-980X с частотой 3.33 ГГц с 6 ГБ памяти и графической картой NVIDIA GeForce* GTX 285.

 

 

 

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Теги: