2011-09-29 27 views
6

我正在研究一個瀏覽器中的Silverlight應用程序,它有一些相當計算密集的操作,例如運行逆離散餘弦變換或快速傅立葉變換,每秒一次。能夠儘可能多地將這些內容卸載到計算機的GPU上是非常有價值的。我知道使用像素着色器的Silverlight 3和4有some discussion,但共識是因爲Silverlight 3/4沒有使用像素着色器的硬件加速,並且像素着色語言僅限於2級如果有的話,這不會導致性能的提高。在Silverlight 5上使用GPU進行通用數學運算

然而,據推測,Silverlight 5具有更廣泛的硬件加速圖形,包括一個相當完整的3D管線。但是,我還沒有聽說過任何人是否能夠利用這條管道來加速通用數學運算(如FFT,DCT,IDCT等)。有沒有人嘗試過呢?任何關於從哪裏開始尋找的指針?

回答

5

我想我會回覆迄今爲止發現的。簡短的回答是,不,我不認爲Silverlight 5上的3D管道可以用於這種事情。一方面,據我所知,作爲管線一部分的像素着色器和頂點着色器實際上是在GPU上執行的(與在CPU上執行的Silverlight 4中的2D着色器不同) 。

但是,說:

(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是一個只寫設備。您將着色器加載到它上面,加載數據,拉動觸發器,然後再次揮手。您的代碼將永遠不會再看到這些字節。

如果事實證明我錯了,我會回到這裏並更新這個答案。但至少在目前看來,這似乎是一個死衚衕。

[編輯10/10/11 - 根據MS的Shawn Hargreaves,這在Silverlight 5中不受支持。他猜測爲什麼(a)難以在所有GPU驅動程序中保持一致地工作,和(b)除了一小部分演示程序風格的問題外,沒有任何意義。噢。]

相關問題