Страница 4: Async Compute

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

Динамическая балансировка нагрузки через Async Compute
Динамическая балансировка нагрузки через Async Compute

Асинхронные вычисления будут играть весьма существенную роль в будущем. AMD разработала выделенный аппаратный блок Asynchronous Shaders, который является частью архитектуры Graphics Core Next. В результате AMD выигрывает в некоторых играх DirectX 12, по крайней мере, если они используют Asynchronous Shaders. Хорошим примером можно назвать Ashes of the Singularity. NVIDIA с архитектурой Pascal представила новую технологию динамической балансировки нагрузки (Dynamic Load Balancing). Она призвана помочь, в частности, в ситуациях, когда задачи и вычисления необходимо стартовать одновременно, но их вычислительная сложность очень сильно различается. Предыдущие технологии статического распределения (Static Partitioning) в Maxwell давали намного меньшую эффективность по сравнению с динамической балансировкой нагрузки, то есть они хуже задействовали имеющиеся вычислительные блоки.

Вытеснение (Preemption)

Поскольку на графическом процессоре могут выполняться параллельно несколько задач, иногда имеет смысл остановить одну задачу, чтобы выполнить другую, более чувствительную к задержкам. А потом доделать остаток первой задачи. В таких ситуациях срабатывает механизм вытеснения (Preemption), который очень похож на вытесняющую многозадачность в мире операционных систем. Здесь любой процесс может прерываться в определенное время, независимо от того, завершил он задание или нет. Как правило, вычисления можно разделить на временные промежутки, в которые и выполняется вытеснение. Если процесс прерван, то его регистры и кэши переносятся из GPU в видеопамять. Как только процесс вернется на исполнительные ресурсы, он продолжится с прерванного места.

Чтобы подобный механизм был как можно более гибким, очень важна возможность прерывать вычисления в любой момент. То есть уменьшить размер временных промежутков до минимума. Раньше выполнялось на уровне треугольников (или вызовов Draw Call), то есть снять процесс можно было только по завершении обработки треугольника. Теперь выполнение вытеснения возможно на уровне пикселей. То есть процесс на графическом конвейере может остановиться на уровне ближайшего пикселя, после чего он будет восстановлен со следующего пикселя. Ранее такое тонкое разбиение не было возможным.

Вытеснение на архитектуре PascalВытеснение на архитектуре Pascal

Вытеснение на архитектуре Pascal

Что касается вычислений, в архитектуре Maxwell присутствовал эквивалент попиксельного вытеснения на уровне потоков (thread). В Pascal он тоже имеется, но добавлено вытеснение на уровне инструкций в задачах CUDA. В драйверах NVIDIA подобная функция еще не задействована, но она будет реализована в будущем, как и попиксельное вытеснение. В результате NVIDIA удалось сократить временные промежутки с нескольких миллисекунд до уровня менее 100 мкс.

Вытеснение очень важно для приложений VR, в том числе для функции Asynchronous Timewarp. Если видеокарта не может выдавать кадры каждые 11 мс (90 кадров в секунду), ATW генерирует промежуточный кадр, используя последние данные конвейера рендеринга с коррекцией позиции головы. Такой кадр необходимо создать как можно быстрее, и здесь как раз новый механизм вытеснения должен себя показать с лучшей стороны.