2011-09-29 11 views
6

Estoy trabajando en una aplicación de Silverlight en el navegador que tiene algunas operaciones de cálculo bastante intensivo, por ejemplo, ejecutar una Transformada de Coseno Discreta Inversa, o una Transformada de Fourier Rápida, cientos de veces por segundo. Sería valioso poder descargar tanto de esto como sea posible en la GPU de la computadora. Sé que hubo some discussion de esto con Silverlight 3 y 4, usando sombreadores de píxeles, pero el consenso fue que debido a que Silverlight 3/4 no usó aceleración de hardware para sus sombreadores de píxeles, y porque su lenguaje de sombreado de píxeles estaba limitado al Nivel 2 , no iba a generar un gran aumento en el rendimiento, si lo hubiera.Uso de GPU en Silverlight 5 para matemáticas de propósito general

Sin embargo, supuestamente Silverlight 5 tiene una gama mucho más amplia de gráficos acelerados por hardware, incluida una tubería 3D razonablemente completa. Sin embargo, aún no he escuchado si alguien ha podido aprovechar esta canalización para acelerar operaciones matemáticas de propósito general (como FFT, DCT, IDCT, etc.). ¿Alguien ha intentado eso todavía? ¿Alguna sugerencia sobre dónde empezar a buscar?

Respuesta

5

Pensé en publicar lo que descubrí hasta ahora. La respuesta corta es que no, no creo que la canalización 3D en Silverlight 5 se pueda aprovechar para este tipo de cosas. Por un lado, por lo que puedo decir, los sombreadores de píxel y los sombreadores de vértices que son parte de la tubería, de hecho, se ejecutan en la GPU (a diferencia de los sombreadores 2D en Silverlight 4, que se ejecutaron en la CPU) .

Pero dicho:

(1) Todo lo que he leído dice que la obtención de datos sobre la GPU es muy rápido, pero que para la mayoría de las máquinas, consiguiendo que los datos fuera de la GPU es mucho más lento, en el orden de milisegundos. Eso hace que sea poco probable que podamos, por ejemplo, cargar la GPU con los datos necesarios para realizar una FFT, realizar la FFT y luego recuperar los datos más rápido de lo que podríamos hacerlo en la CPU.

(2) Silverlight 5 tiene un conjunto muy limitado de instrucciones que puede ejecutar en la GPU. Específicamente, está limitado a HLSL Level 2, que tiene un número limitado de instrucciones y registros disponibles. Dudo que sea posible, en el mejor de los casos, sería muy difícil y muy lento, modelar una FFT o una DCT dentro de esas instrucciones limitadas.

(3) Pero incluso si pudiéramos superar esas dos limitaciones, por lo que puedo decir, Silverlight no tiene la capacidad de leer los resultados de los cálculos que está realizando la GPU. El XNA normal (el marco en el que se basan las características 3D de Silverlight) tiene varios métodos GetData() o GetTexture() que creo que podría usar para leer los resultados de un conjunto de cálculos. Pero esos métodos equivalentes faltan en sus versiones de Silverlight 5. Por todo lo que puedo decir, en Silverlight 5, la GPU es un dispositivo de solo escritura. Usted carga sus sombreadores en él, carga sus datos, aprieta el gatillo y se despide con la mano. Su código nunca volverá a ver esos bytes.

Si resulta que estoy equivocado en esto, volveré aquí y actualizaré esta respuesta. Pero al menos en este momento, parece que esto es un callejón sin salida.

[Editar 10/10/11 - Según Shawn Hargreaves de MS, esto no es compatible con Silverlight 5. Su suposición de por qué es que (a) sería difícil hacerlo funcionar de manera consistente en todos los controladores de GPU y (b) para todos menos una pequeña clase de problemas de estilo de demostración, no tendría ningún sentido. Oh, bueno.]

Cuestiones relacionadas