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

时间:2011-09-29 23:47:13

标签: silverlight gpu silverlight-5.0

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

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

1 个答案:

答案 0 :(得分:5)

我以为我会回复到目前为止我发现的内容。简短的回答是,不,我不认为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)除了一小类演示软件风格的问题之外,它都没有任何意义。哦,好吧。]