微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Silverlight 5上使用GPU进行通用数学运算

我正在开发一个浏览器内的Silverlight应用程序,该应用程序具有一些相当计算密集的操作,例如,运行反向离散余弦变换或快速傅立叶变换,每秒数百次.能够尽可能多地将其卸载到计算机的GPU上是很有价值的.我知道使用像素着色器的Silverlight 3和4中有 some discussion这个,但是大家一致认为,因为Silverlight 3/4没有对像素着色器使用硬件加速,并且因为它们的像素着色器语言仅限于2级如果有的话,它不会导致性能提升.

然而,据称Silverlight 5具有更广泛的硬件加速图形,包括一个相当完整的3D管道.但是,我还没有听说是否有人能够利用这个管道加速通用数学运算(如FFT,DCT,IDCT等).还有人试过吗?有关从哪里开始寻找的指示?

解决方法

我以为我会回复到目前为止我发现的内容.简短的回答是,不,我不认为Silverlight 5上的3D管道可以用于此类事情.一方面,据我所知,作为管道一部分的像素着色器和顶点着色器实际上在GPU上执行(与Silverlight 4中的2D着色器不同,它们在cpu上执行) .

但那说:

(1)我读过的所有内容都表明将数据传输到GPU非常快,但对于大多数机器来说,从GPU获取数据的速度要慢得多,大约为毫秒级.这使得我们不太可能将GPU加载执行FFT所需的数据,执行FFT,然后将数据拉回到比我们在cpu上执行的速度更快的速度.

(2)Silverlight 5具有非常有限的指令集,可以在GPU上执行.具体来说,它仅限于HLSL Level 2,它具有有限数量的指令和寄存器.我怀疑在这些有限的指令中建模FFT或DCT是可能的 – 充其量是非常困难和非常慢的.

(3)但即使我们可以解决这两个限制,从我所知,Silverlight没有任何能力读取GPU正在执行的计算结果.普通XNA(Silverlight的3D功能所基于的框架)具有各种GetData()或GetTexture()方法,我认为您可以使用这些方法来读取一组计算的结果.但是Silverlight 5版本中缺少那些等效的方法.从我能说的一切,在Silverlight 5中,GPU是一个只写设备.您将着色器加载到它上面,加载数据,拉动扳机,然后挥手告别.您的代码将永远不会再看到这些字节.

如果事实证明我错了,我会回到这里并更新这个答案.但至少在目前,看起来好像这是一个死胡同.

[编辑10/10/11 – 根据MS的Shawn Hargreaves,这在Silverlight 5中不受支持.他猜测为什么(a)难以让它在所有GPU驱动程序中保持一致,并且(b)除了一小部分演示软件风格的问题外,它没有任何意义.那好吧.]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐