Использование графического процессора в Silverlight 5 для математики общего назначения - PullRequest
6 голосов
/ 30 сентября 2011

Я работаю над приложением Silverlight в браузере, в котором выполняются некоторые довольно сложные вычисления, например, выполняется обратное дискретное косинусное преобразование или быстрое преобразование Фурье, сотни раз в секунду.Было бы полезно иметь возможность выгрузить как можно больше из этого на графический процессор компьютера.Я знаю, что было некоторое обсуждение этого с Silverlight 3 и 4, с использованием пиксельных шейдеров, но единодушным было то, что Silverlight 3/4 не использовал аппаратное ускорение для своих пиксельных шейдеров и потому, что их пиксельЯзык шейдеров был ограничен уровнем 2, он не собирался приводить к значительному увеличению производительности, если он вообще был.

Тем не менее, предположительно, Silverlight 5 обладает гораздо более широким диапазоном графики с аппаратным ускорением, включая достаточно полный 3D-конвейер.Однако я еще не слышал, чтобы кто-нибудь смог использовать этот конвейер для ускорения математических операций общего назначения (таких как FFT, DCT, IDCT и т. Д.).Кто-нибудь пробовал это еще?Какие-нибудь указатели на то, где начать искать?

1 Ответ

5 голосов
/ 07 октября 2011

Я думал, что отправлю обратно то, что обнаружил до сих пор.Короткий ответ: нет, я не думаю, что 3D-конвейер в Silverlight 5 можно использовать для такого рода вещей.С одной стороны, насколько я могу судить, пиксельные шейдеры и вершинные шейдеры, являющиеся частью конвейера, фактически выполняются на GPU (в отличие от 2D-шейдеров в Silverlight 4, которые выполнялись на CPU),

Но это говорит:

(1) Все, что я прочитал, говорит о том, что загрузка данных в GPU очень быстрая, но для большинства машин получение этих данных из GPU - это оченьмедленнее, порядка миллисекунд.Это делает маловероятным, что мы можем, скажем, загрузить GPU данными, необходимыми для выполнения FFT, выполнить FFT, а затем извлечь данные обратно быстрее, чем мы могли бы просто сделать это на CPU.

(2) Silverlight 5 имеет очень ограниченный набор инструкций, которые он может выполнять на GPU.В частности, он ограничен HLSL уровня 2 , который имеет ограниченное количество доступных инструкций и регистров.Я сомневаюсь, что было бы возможно - в лучшем случае, это было бы очень трудно и очень медленно - моделировать БПФ или DCT в рамках этих ограниченных инструкций.

(3) Но даже если бы мы могли обойтиИз этих двух ограничений, насколько я могу судить, Silverlight не имеет возможности считывать результаты вычислений, выполняемых графическим процессором.Обычный XNA (каркас, на котором основаны трехмерные функции Silverlight) имеет различные методы GetData () или GetTexture (), которые, я думаю, можно использовать для чтения результатов набора вычислений.Но эти эквивалентные методы отсутствуют в их версиях Silverlight 5.Из всего, что я могу сказать, в Silverlight 5 графический процессор является устройством только для записи.Вы загружаете на него свои шейдеры, загружаете данные, нажимаете на курок и машете на прощание.Ваш код никогда не увидит эти байты снова.

Если окажется, что я ошибаюсь, я вернусь сюда и обновлю этот ответ.Но, по крайней мере, на данный момент все выглядит так, как будто это тупик.

[Редактировать 10/10/11 - Согласно Шон Харгривз из MS, это не поддерживаетсяв Silverlight 5. Его предположение о том, что (а) было бы трудно заставить его работать согласованно для всех драйверов графического процессора, и (б) для всех, кроме крошечного класса проблем в стиле демонстрационной программы, это не будетиметь смысл.Ну хорошо.]

...