DirectX. Единая модель программ-шейдеров. Доступ к кадровому буферу в пиксельных программах, страница 3

Если расширить эту технологию на графические процессоры, то виртуальная память смогла бы очень хорошо решить проблемы с производительностью, поскольку все текстуры, программы-шейдеры и другие объекты будут разбиваться на маленькие порции данных, которые будут быстро передаваться по шине. Страница на 4 кбайт, к примеру, соответствует подтекстуре 32x32x32 бита, которая достаточно велика, чтобы вы не пересылали множество страниц по шине для её отображения (то есть, вряд ли в текущем кадре отображается регион выше 32x32 текселей для данной текстуры), но достаточно мала, чтобы её передача не нанесла ущерб производительности.

Целочисленный набор инструкций.

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

На текущем поколении графических процессоров единственный тип адресации памяти, относится к обращению к текстурам, при этом используются значения с плавающей запятой. Если адрес не точно совпадает с текселем, то будет браться либо ближайший тексель (в случае точечного чтения), или будут взяты несколько текселей, а затем будет произведена интерполяция, чтобы получить значение на базе ближайших текселей. Для текстур подобный способ превосходен, но он явно не подходит для общей адресации к памяти, где смежные блоки памяти могут быть разными (поэтому интерполяция между ними бессмысленна). К счастью, Microsoft добавила полный целочисленный набор инструкций в модель программ-шейдеров 4.0, решая подобные проблемы.

Неограниченные ресурсы.

Виртуальная видеопамять помогает решению проблемы ресурсов несколькими путями. Во-первых, повышается ценность информационного хранилища на базе AGP/системной памяти, что связано с увеличением пропускной способности и улучшению эффективности использования памяти. Во-вторых, поскольку виртуальная память использует логическую адресацию, пользователь графического процессора может запрашивать столько памяти, сколько он желает нужным, в пределах виртуального адресного пространства. Остальное зависит от эффективности привязки виртуальной памяти к физической с учётом ограничений компьютера. Приложения, неразумно потребляющие память, не смогут обеспечить оптимальной частоты кадров, но, по крайней мере, они будут работать. Виртуальное адресное пространство не должно быть малым - 3Dlabs Wildcat VP использует виртуальную видеопамять с виртуальным адресным пространством 16 Гбайт. Конечно же, физические ресурсы быстро подойдут к концу, если вы пожелаете использовать все 16 Гбайт.

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