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

6
我正在开发一款基于浏览器的Silverlight应用程序,其中包含一些相当计算密集的操作,例如运行反离散余弦变换或快速傅里叶变换等,每秒数百次。如果能够尽可能多地将这些操作卸载到计算机的GPU上,那将非常有价值。我知道在Silverlight 3和4中曾经讨论过使用像素着色器进行此操作,但是共识是由于Silverlight 3/4没有使用像素着色器的硬件加速,并且因为它们的像素着色器语言仅限于Level 2,所以即使有性能提高,也不会很大。

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

1个回答

5
我想分享一下我目前所发现的情况。简短的答案是不行,我认为在Silverlight 5上无法利用3D管道来完成这种事情。一方面,从我所了解的情况来看,管道中的像素着色器和顶点着色器确实在GPU上执行(与Silverlight 4中在CPU上执行的2D着色器不同)。
但是:
(1)我所读到的所有内容都说,将数据加载到GPU上非常快,但对于大多数计算机来说,从GPU中取出数据的速度要慢得多,大约需要几毫秒时间。这使得我们很难通过加载必要的数据来执行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 - 根据微软的Shawn Hargreaves所说,Silverlight 5不支持此功能。他猜测原因是(a)很难在所有GPU驱动程序上保持一致性,以及(b)除了一小部分演示类问题外,它没有任何意义。哦,好吧。]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接