2015-07-05 71 views
5

我正在使用CUDA上運行的Marching Cubes算法從體積數據生成網格。如何優化VBO/IBO以最大化GPU緩存使用率

我試過保存網格並以3種方式渲染它。

  1. 保存一組粗糙的三角形作爲頂點數據的連續數組。 我估計大小,如果第一遍中,創建一個OpenGL VBO, 地圖它CUDA和格式寫下面

V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...

頂點數據以將其與使用glDrawArrays()繪製它。

VBO中的冗餘頂點,每個多維數據集的冗餘頂點,無索引。

  • 採取網格從步驟1中,使用thrust::sort()thrust::unique()使用thrust::lower_bound()以除去多餘的頂點,計算指數。將結果保存到映射到CUDA的OpenGL VBO/IBO。 使用glDrawElements()繪製模型。
  • 在VBO中沒有冗餘頂點,生成的索引。

  • 生成每立方體的頂點的唯一列表,它們在VBO存儲與它們的索引在所述三角形IBO沿。使用glDrawElements()呈現。
  • 在VBO

    冗餘頂點,每立方獨特的頂點,每立方生成指數

    現在,我得到了在同一ISO-值`同一數據集的FPS是

    Method 1 : 92 FPS, 30,647,016 Verts,   0 Indices 
    Method 2 : 122 FPS, 6,578,066 Verts, 30,647,016 Indices 
    Method 3 : 140 FPS, 20,349,880 Verts, 30,647,016 Indices 
    

    儘管方法2產生最少的頂點數,但FPS很低。我相信這是因爲索引是按照最小化GPU緩存使用率的順序。方法3的索引順序獲得更高的GPU緩存使用率,因此FPS更高。

    如何修改/修改方法2以產生更高的FPS?

    +1

    沒有你的FPS測量方法考慮到它需要刪除使用推力冗餘頂點的時間? –

    +0

    @ m.s。刪除只能進行一次。我不是在尋找實時清除方法。當等值被更改時,我只是在方法1中渲染原始網格。一旦變化不變,我就會處理大約4秒的去除。之後,我只使用VBO/IBO渲染網格。我想爲這個網格提供更高的FPS,而只是渲染,當我測量FPS時不會進行提取或壓縮。 – Harish

    回答

    1

    有兩件事情可以幫助:

    • 試圖通過將頂點大致在以優化數據高速緩存使用,你會吸引他們
    • 試圖優化post transform cache使用(有一個算法來做到這一點here和實現大概可以在網絡上找到)
    +0

    謝謝@Jerem,我會嘗試這個算法[Fast Vertex Cache Opt](https://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html)。將會更新它的結果。 我想找到一些使用盡可能少內存的算法,因爲我的網格大小往往變得非常大。 – Harish

    +0

    嘗試了上述算法的CPU實現,但它的工作原理太慢了。 60K網格花了12秒鐘,我的網格高達20M,對於這種尺寸的網格來說它不可行。尋找可擴展到GPU的解決方案。 – Harish

    +0

    您是否嘗試按照您繪製的順序排列頂點? – Jerem