2013-04-10 115 views
0

我有一個過程,隨着時間的推移積累了大部分靜態數據 - 以及它的很多數以百萬計的數據元素。數據的一小部分可能會偶爾發生變化,但大部分情況並不會改變。在GPU上優化數據可視化?

但是,我想允許用戶自由地改變這些數據的形狀和顏色。

有沒有一種方法可以將數據作爲數據存儲在GPU上。然後有許多方法可以將數據轉換爲GPU上可呈現的內容。然後用戶可以在這些算法中進行選擇,並且我們可以高效地進行交換,而不必觸摸數據。此外,顏色ID將在數據中,但用戶可以改變每個ID應匹配的顏色,而不用觸摸數據。

因此,舉例來說,可能有如下的數據:

[1000,602,1,1] [1003 602.5,2,2]

注意:數據是NOT頂點,而是可能需要一些計算或查找來轉換爲頂點。

用戶可以選擇可視化算法。假設一個人會在(0,602,0)和(3,602.5,100)處顯示兩個立方體。用戶選擇顏色ID 1 =藍色和2 =綠色。所以起源立方體顯示爲藍色,另一個顯示爲綠色。

然後,根本沒有對數據進行任何修改,用戶選擇不同的可視化,現在球體顯示在(10,602,10)和(13,602.5,20),並且顏色不同,因爲用戶改變了顏色映射。

另一種可視化可能會顯示所有數據元素,或者爲每個組4個矩形之間的線路等

就是上面描述的東西,可以以簡單的方式來完成?最好怎麼做?

請注意,我們將添加新數據,並追加到最後。可能每秒發生數千次的爆發。現有數據的修改會更爲少見,並且對這些情況的性能影響是可以接受的。用戶更改算法和顏色映射相對較少。

我寧願使用跨平臺API(跨操作系統和GPU)來做到這一點,所以我假設OpenGL。

回答

1

您可以將數據存儲在VBO(在GPU內存中),並在更改時更新它。

在GPU方面,您可以使用幾何着色器來生成更多的幾何圖形。不知道如何從線切換到球體,但如果您在每個位置繪製三角形,則GS可以輸出「額外」三角形(線和點同上)。

至於顏色更改功能,您可以將該邏輯烘焙到頂點着色器中。 idx(1,2,...)應該是一個頂點屬性;有VS查找表給idx - >顏色映射(這可以存儲爲一個小紋理)。您可以更新紋理以即時更改顏色映射。

+0

謝謝!有什麼方法可以優化附加到VBO?因爲我有時可能會很快添加數據。 另外,在幾何着色器中,它是否可以一次訪問多個點,以便在一種情況下可以爲每個點創建一個形狀,但在其他情況下,它會爲每個多點創建一個形狀? – mentics 2013-04-10 06:44:06

+0

'glBindBuffer'接受一個* target *參數(它暗示着這個VBO是否保存頂點或索引數據)。 'glBufferData'接受一個*用法*參數(暗示數據是靜態的,動態的還是流的,以及應用程序是否會讀取,複製或繪製)。 – 2013-04-10 06:49:14

+0

此外,什麼確切的提示組合會給**你**最好的性能只能通過分析發現。這真的歸結於您的硬件+ OpenGL驅動程序版本。 – 2013-04-10 06:55:14

0

對於像你這樣的應用程序,有特殊的GPGPU編程基礎設施:CUDA和OpenCL。 OpenCL是跨供應商系統。 CUDA是交叉平臺,但僅支持NVidia GPU。此外,OpenGL在OpenGL-4.2(計算着色器)中引入了通用計算功能。

和它的很多,數據元素

百萬上千萬是不是一個很大量的,哪怕一個單一的元素消耗100個字節,這將是那麼只有100的MIB爲了transfert。現代GPU可以從主機系統內存傳輸大約10 GiB/s的數據。

上述描述是否可以用直接的方式完成?最好怎麼做?

是的,它可以做到。但是,只有當您可以並行處理您的問題並使其內存訪問模式迎合GPU的偏好時,纔會真正看到性能。特別糟糕的內存訪問模式會導致幾個數量級的性能損失。