[討論] 初學者 GPU 運算觀念

作者: kanonehilber (隱居處)   2017-09-23 01:31:24
上網找一些資料,發現目前研究的題目似乎很適合用GPU來進行計算,所以最近想要學習
使用GPU來增加工作效率,不過有些基本觀念想問一下
我先參考了張正星老師的網頁範例(最後一個範例)
https://goo.gl/tnoJai
運算時間可以壓縮到1/1000以下,不過網頁裡有提到這個時間不包含資料搬移,後來發現
這個範例在我的電腦上用GPU計算總消耗時間還比CPU更多,我就認為問題應該是出在資料
搬移消耗太多時間,如果沒有這個步驟應該就會非常快
但是後來我又找到下面這個MATLAB官網的教學影片,他有提到可以直接在GPU上定義變數
https://goo.gl/4mQU3K
這樣一來就可以減少用gpuArray搬移資料所花費的時間,我預期計算總消耗時間應該可
以大幅降低,不過我在我的電腦上跑發現跟先在CPU上定義再搬移資料比起來差不了多少
我直接照抄他的程式(影片4分15秒左右),另外多加了一個用gpuArray搬移資料的case
M=300;
K=500;
N=100;
P=200;
tic;
A=rand(M,K);
B=rand(K,N,P);
C=zeros(M,N,P);
for I=1:P
C(:,:,I)=A*B(:,:,I);
end
t=toc;
disp(['CPU ' num2str(t)])
tic;
A=gpuArray(A);
B=gpuArray(B);
C=gpuArray(C);
for I=1:P
C(:,:,I)=A*B(:,:,I);
end
wait(gpuDevice)
t=toc;
disp(['CPU transfer to GPU ' num2str(t)])
tic;
A=rand(M,K,'gpuArray');
B=rand(K,N,P,'gpuArray');
C=zeros(M,N,P,'gpuArray');
for I=1:P
C(:,:,I)=A*B(:,:,I);
end
wait(gpuDevice)
t=toc;
disp(['GPU ' num2str(t)])
tic;
A=rand(M,K,'gpuArray');
B=rand(K,N,P,'gpuArray');
C3=pagefun(@mtimes,A,B);
wait(gpuDevice)
t=toc;
disp(['GPU pagefun ' num2str(t)])
執行結果是
CPU 1.3239
CPU transfer to GPU 2.5428 (用gpuArray搬移)
GPU 2.3113
GPU pagefun 0.78102
雖然直接在GPU上定義是比用從CPU上搬移過去快,但是快不了多少,而且還是比用CPU慢
請問這是為什麼? 我原本是預期因為沒有搬移,所以速度應該遠快於用CPU,還是除了
張老師那個網頁提到的搬移資料之外有其他的原因會拖慢計算時間呢?
感恩~
====
順帶一提我的電腦是acer windows 8.1 筆電
處理器 Intel(R) Pentium(R) CPU N3540 @ 2.16 GHz
顯示卡 NVIDIA GEFORCE 810M
還有為了能在MATLAB上用GPU運算今天剛安裝的driver CUDA version 7.5
作者: rex0707 (我就是我)   2017-09-23 09:40:00
我測Example-3沒啥問題
作者: sunev (Veritas)   2017-09-23 14:59:00
GPU 也是要vectorize的
作者: rex0707 (我就是我)   2017-09-23 18:10:00
加速比 比網頁上的還要快XD
作者: kanonehilber (隱居處)   2017-09-23 19:02:00
我也比他的快XD請問vectorize大概是一個什麼樣的概念,對MATLAB的構造不太了解 謝謝
作者: sunev (Veritas)   2017-09-24 13:14:00
簡單講就是不要用明顯的for loop,多用內建函數。
作者: kanonehilber (隱居處)   2017-09-25 04:05:00
原來如此 感恩 我再慢慢研究

Links booklink

Contact Us: admin [ a t ] ucptt.com