2011-06-09 343 views
2

我正在處理一組(大2k x 2k)圖像
我需要對每個像素進行一系列操作,這些操作需要一些連續的圖像。CUDA 2D或3D陣列

對使用​​單個2D大紋理+計算偏移量還是使用3D數組有什麼意見?

在CUDA API中,3D陣列似乎有點不在主流中,分配傳遞函數與2D功能有很大不同。

似乎有沒有要上更高級別的任何好的文檔「如何以及爲什麼」 CUDA的而不是具體的調用

還有就是best practices guide,但它並沒有解決這個

+0

你是在讀圖像多次?否則使用紋理似乎有點多.. – 2011-06-09 17:40:17

+0

@帕萬我扔視頻序列卡,並做一些圖像處理,然後渲染處理的視頻。使用opengl PBO似乎是最簡單的方法 – 2011-06-09 17:43:51

+0

我個人避免使用紋理,主要是因爲他們的文檔不好。綁定和解除綁定紋理也需要很長時間。雖然我不能評論使用cuda紋理和opengl PBO。 – 2011-06-09 17:52:57

回答

6

我會建議你閱讀「Cuda by Example」一書。它貫穿所有這些沒有記錄的事情,它會解釋「如何和爲什麼」。

我想你應該使用什麼,如果你渲染的CUDA內核的結果是使用OpenGL互操作。這樣,您的代碼就可以在GPU上處理圖像,並將處理後的數據保留在那裏,從而使渲染速度更快。這本書中有一個很好的例子。

如果每個CUDA線程只需要從第一幀讀取一個像素,並從下一幀讀取一個像素,則不需要使用紋理。如果每個線程正在讀取一堆連續的像素,則紋理僅對您有益。所以你最好使用3D陣列。

+0

我讀過它,但3D陣列是一個新功能,不在本書中討論。使用紋理使openGL互操作變得更容易,大多數圖像處理例程無論如何都訪問相鄰像素。 – 2011-06-09 22:00:10

+0

當然,使用紋理沒有問題。如果你打算使用少量的幀,那麼你可以定義多個1D或2D紋理紋理。你提到你正在做幀到幀的事情,所以你只需要2個紋理,比如紋理A和B.你將幀1和幀2加載到A和B中,然後你的內核處理A和B.然後你簡單地替換第1幀與第3幀,然後你的內核將處理紋理B和A(按照該順序),這相當於處理第2幀和第3幀。 – r2jitu 2011-06-10 01:03:18

+0

@ r2jitsu - 這就是我所做的。 cuda對紋理陣列的支持很差,而且3D令人困惑,所以我只是將紋理的高度提高了N倍,並對待處理的幀進行了處理。 – 2011-06-10 02:08:52