從matlab2013版本開始,matlab將可以直接呼叫gpu進行平行計算,而不再需要安裝gpumat庫。這一改動的好處是原有的matlab內建函式都可以直接運用,只要資料格式是gpuarray格式的,那麼計算過程會自動的呼叫gpu進行計算
具體操作起來,只要知道下面幾個函式就可以像編寫簡單的m檔案一樣,進行matlab的gpu程式設計
1.gpu裝置確認函式
1)n=gpudevicecount %返回裝置上的gpu數目
2)gpudevice %選擇gpu裝置
d=gpudevice or gpudevice(): 如果當前還未設定選擇的gpu,則選擇預設的gpu,d是返回物件;如果已經設 置了gpu,則返回設定的gpu物件。
d=gpudevice(idx): 表示選擇idx對應的gpu設定,d是返回物件
%ps: 目前的gpu設定一般至少包含兩個gpu,分別用1和2表示對應的idx。
3)reset(gpudev) %清空gpu的記憶體,類似matlab的clear的功能。其中gpudev是gpudevice所返回的物件。
2.gpu以cpu之間的互動
1)gpuarray(cpu–>gpu)
主要有兩個功能:
i) 將cpu記憶體資料傳導到gpu記憶體中
例子-1:
x=rand(10,』single』); %定義在cpu上的乙個10x10的隨機初始化陣列
gx=gpuarray(x); %在gpu開始陣列gx,並且將x的值賦給gx
gx2=gx.*gx; %gpu上執行陣列對應位置的點乘
ii)在gpu記憶體中隨機初始化一些記憶體資料。
例子-2:
gx=rand(10,』gpuarray』); %直接在gpu裝置上隨機初始化乙個10x10的陣列
%%ps:常用的隨機初始化函式有:eye, ones, zeros, rand, randi, randn.
2)gather(gpu–>cpu)
主要是將gpu記憶體中的資料拷貝回cpu記憶體中。
繼續例子-1
x2=gather(gx2) %將gpu記憶體中的陣列gx2賦值給cpu中的x2
3)tf=existongpu(data)
用於判斷data是否存在於gpu記憶體中。如果不存在則返回false。
3.計算效率統計
t=gputimeit(f,n) %返回執行f操作n次所需的時間,當n=1時可以預設
4.實際例子,用gpu來進行fft濾波
那麼現在比如說我想對乙個很長的數列進行fft濾波,待處理的數列received_sig有1270000個數,而濾波器本身序列matched_sig也有2540個數。如果簡單的使用filter(matched_sig,1,filtered_sig)指令,執行一次耗時17秒。如果多執行幾次,所耗費的時間是無法承受的。而如果先將received_sig丟進gpu裡面,讓gpu來進行fft運算,就能大大節省時間。
下面是相關的**
g_received_sig=gpuarray(received_sig) ;
g_get_sig=filter(matched_sig,1,g_received_sig) ;
get_sig=gather(g_get_sig) ;
其中,gpuarray將變數從cpu拷進gpu裡面,進行完fft運算以後,通過gather從gpu內拷出來。實際證明執行一次這樣的指令平均耗時3.3秒,大大減少了所需要的時間。
還有一點要說明的是,盡量不要在需要gpu運算的部分有判斷,迴圈等語句,這樣會讓gpu運算的效率急劇下降,因為gpu跟cpu之間的頻繁互動也是很耗費時間的。
matlab呼叫gpu進行矩陣運算
最近在使用matlab計算矩陣的特徵值時,遇到很大的困難,對於乙個30000 30000的矩陣,特徵值計算一次需要花近三個小時,矩陣是非常稀疏 且有乙個零特徵根 的,將矩陣轉成稀疏矩陣形式後,只算最小的幾個特徵值,速度上很快,但是每次算出來的特徵值都不一樣。不知道原因出在 可能跟矩陣有乙個零特徵值有...
使用matlab對輸入資料進行卡爾曼濾波
使用matlab對輸入資料進行卡爾曼濾波。簡單說明一下程式中的資料。假設一輛汽車從初始點 0,10 開始行駛,初始速度沿y軸正方向10m s。然後在觀測途中向右先加速再減速變換車道。整個過程其實有x軸座標,y軸座標,x軸速度,y軸速度以及x軸的加速度這5個物理量。但在卡爾曼濾波時我只用了x軸座標,y...
基於matlab對ECG訊號進行濾波處理
由微控制器採集心率資料,擷取部分資料處理如下 前提 根據取樣定理,心率訊號取樣頻率為50hz 大於心率的頻率兩倍 得帶資料訊號資料來源 b.txt 檔案。1.原始資料的採集擷取有效部分分析。2.資料濾波 50hz的工頻干擾以及放大器本身的漂移 要根據頻譜具體分析 3.fda數字濾波器設計,相應係數的...