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

Ken*_*ith 6 silverlight gpu silverlight-5.0

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

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

Ken*_*ith 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)对于除了一小类演示器式问题之外的所有问题,它都没有任何意义.那好吧.]