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

在Silverlight 5上使用GPU进行通用数学,silverlight,gpu,silverlight-5.0,Silverlight,Gpu,Silverlight 5.0,我正在开发一个浏览器中的Silverlight应用程序,它具有一些相当密集的计算操作,例如,每秒运行数百次离散余弦逆变换或快速傅里叶变换。能够将尽可能多的信息转移到计算机的GPU上是很有价值的。我知道Silverlight 3和4使用像素着色器时会出现这种情况,但一致的意见是,由于Silverlight 3/4没有为其像素着色器使用硬件加速,并且其像素着色器语言仅限于级别2,因此不会导致性能的大幅提高(如果有的话) 然而,据说Silverlight 5有更广泛的硬件加速图形,包括一个相当完整的3

我正在开发一个浏览器中的Silverlight应用程序,它具有一些相当密集的计算操作,例如,每秒运行数百次离散余弦逆变换或快速傅里叶变换。能够将尽可能多的信息转移到计算机的GPU上是很有价值的。我知道Silverlight 3和4使用像素着色器时会出现这种情况,但一致的意见是,由于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上执行的指令集非常有限。具体来说,它仅限于,它的可用指令和寄存器数量有限。我怀疑在这些有限的指令中对FFT或DCT进行建模是可能的——充其量是非常困难和缓慢的

(3) 但是,即使我们可以绕过这两个限制,从我所知道的,Silverlight也没有任何能力读取GPU正在执行的计算结果。普通XNA(Silverlight的3D功能所基于的框架)有各种GetData()或GetTexture()方法,我认为您可以使用这些方法读取一组计算的结果。但在Silverlight 5版本中缺少这些等效方法。据我所知,在Silverlight 5中,GPU是一个只写设备。加载着色器,加载数据,扣动触发器,挥手告别。你的代码再也看不到那些字节了

如果事实证明我错了,我会回来更新这个答案。但至少在目前,这似乎是一条死胡同

[编辑10/10/11-根据微软的说法,Silverlight 5不支持这一点。他猜测原因是(a)很难让它在所有GPU驱动程序中一致工作,以及(b)除了一小类演示软件风格的问题之外,其他所有问题都没有任何意义。哦,好吧。]