[讨论] 初学者 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