作者kanonehilber (隐居处)
看板MATLAB
标题[讨论] 初学者 GPU 运算观念
时间Sat Sep 23 01:31:24 2017
上网找一些资料,发现目前研究的题目似乎很适合用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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.114.235.65
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1506101491.A.93C.html
1F:→ rex0707: 我测Example-3没啥问题 09/23 09:40
请问一下你的没有问题是指?
※ 编辑: kanonehilber (27.247.43.35), 09/23/2017 12:17:48
2F:推 sunev: GPU 也是要vectorize的 09/23 14:59
3F:→ rex0707: 加速比 比网页上的还要快XD 09/23 18:10
4F:→ kanonehilber: 我也比他的快XD 09/23 19:02
5F:→ kanonehilber: 请问vectorize大概是一个什麽样的概念,对MATLAB的 09/23 19:02
6F:→ kanonehilber: 构造不太了解 谢谢 09/23 19:02
7F:推 sunev: 简单讲就是不要用明显的for loop,多用内建函数。 09/24 13:14
8F:→ kanonehilber: 原来如此 感恩 我再慢慢研究 09/25 04:05