GPU平行運算

GPU(graphics processing unit)一開始是為渲染圖形場景而建立,這些場景的數據不需要以串列的方式一步一步執行,而是用並行的方式一次性渲染大量的數據,從結構上來說,GPU不像CPU基於數個寄存器和高速指令集,GPU一般有數百個較小的處理單元。這些處理單元每一個都比CPU的核心慢很多,然而由於它的數目眾多,能夠同時進行大量運算,已經有越來越多的人嘗試用GPU來進行圖形渲染以外的工作,這就產生了GPGPU(general-purpose computation on graphics processing units)的概念。

圖像處理器有它自己的內存,一般稱呼為顯存,當我們從硬碟讀數據並產生一個Mat對象的時候,數據是放在普通內存當中的(由CPU掌管),CPU可以直接操作內存,然而GPU不能這樣,它只能操作它自己的顯存,所以需要先讓CPU將用於計算的信息轉移到GPU掌管的顯存上。完成這一個上傳過程,需要比訪問內存多很多的時間,而且最終的計算結果需要回傳到系統內存,由於傳輸的代價高昂,所以耗時太少的函數到GPU上計算只會造成反效果。

Mat對象僅僅存儲在內存中,GPU上的計算必須使用GpuMat,它的工作方式類似Mat,唯一的限制是不能直接引用GPU函數,使用時要傳輸Mat對像到​GPU上,且計算時使用gpu::內的相對函式,計算完成需再回傳結果,可使用簡單的重載操作符號或者調用下載函數。


以下我們比較傳統的