6

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

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

4

1 回答 1

5

我想我会发回我迄今为止发现的东西。简短的回答是不,我不认为 Silverlight 5 上的 3D 管道可以用于此类事情。一方面,据我所知,作为管道一部分的像素着色器和顶点着色器实际上是在 GPU 上执行的(不像 Silverlight 4 中的 2D 着色器,它们是在 CPU 上执行的) .

但这说:

(1) 我读过的所有内容都说,将数据输入 GPU 非常快,但对于大多数机器来说,从 GPU 取出数据要慢得多,大约为毫秒。这使得我们不可能,比如说,用执行 FFT 所需的数据加载 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 是只写设备。您将着色器加载到它上面,加载数据,扣动扳机,然后挥手告别。您的代码将永远不会再看到这些字节。

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

[编辑 2011 年 10 月 10 日 - 根据 MS 的Shawn Hargreaves的说法,Silverlight 5 不支持这一点。他对原因的猜测是(a)很难让它在所有 GPU 驱动程序中始终如一地工作,并且( b) 对于除了一小部分演示软件风格的问题之外的所有问题,它没有任何意义。那好吧。]

于 2011-10-07T16:42:38.443 回答