GPU (graphic processing units) 的出現和普及,可說是近年來科學計算的最大變革,由於 GPU 具有大量平行處理的能力,所以對於某一些適合平行運算的應用,GPU 可說是最是適合不過了。
但是 GPU 的程式設計,若以 C 或 C++ 來進行,會比一般程式設計複雜一些,你必須要瞭解 GPU 本身的設計概念以及硬體結構,才能夠充分發揮 GPU 的計算能力。但若要在 MATLAB 來使用 GPU 加速各種運算,則是相當容易,因為相關的複雜細節都已經被包含在 MATLAB 簡單的指令內了。
MATLAB 與 GPU 最相相關的兩個基本指令如下:內測試你的機器有幾張
- gpuDeviceCount: 可以回傳你的機器上面有幾張 GPU 卡(或顯卡)。
- gpuDevice: 可以回傳你的預設 GPU 卡的相關訊息。
例如,以下範例可以顯示你的機器上有幾張 GPU 卡,以及預設之 GPU 卡的相關資訊:
在上述範例中,顯示了我的機器只有一張顯卡,並顯示此顯卡的各種相關性質。
在使用顯卡進行運算時,我們通常必須遵循下列基本步驟:
- 使用 gpuArray 指令,將 MATLAB 工作空間的變數搬移到 GPU 的記憶體中。
- 使用 GPU 記憶體中的變數來執行各種在 GPU 的運算。
- 使用 gather 指令,將存放在 GPU 的變數搬移至 MATLAB 工作空間中。
在以下範例中,我們以簡單的矩陣相乘來說明如何操作以上這幾個步驟:
在上述範例中,我們可以觀察到下列現象:
- GPU 的計算時間(不包含資料搬移的時間)大約只有 CPU 計算時間的 1/20。
- GPU 計算結果和 CPU 不完全相同,但兩者的差異性極小。
特別要注意的是,上述 GPU 的計算時間,並不包含資料搬移時間。一般而言,我們應該盡量減少資料搬移,並盡量在 GPU 進行平行運算,否則反而會得不償失。
在前一個範例中,計算加速的幅度和矩陣的維度有很大的關係,下面這個範例將探討這個關係:
在上述範例中,加速幅度很大,GPU 速度可達 CPU 速度的 500 倍以上。但請注意,上述範例的計算並不包含資料搬移所需的時間。
(待續)
MATLAB程式設計:進階篇