为什么在这段代码中,CPU运行得比GPU快? [英] Why does CPU run faster than GPU in this code?
本文介绍了为什么在这段代码中,CPU运行得比GPU快?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用gpuArray
来加速我的计算。但是,下面的代码并非如此。
for i=1:10
calltest;
end
function [t1,t2]=calltest
N=10;
tic
u=gpuArray(rand(1,N).^(1./[N:-1:1]));
t1=toc
tic
u2=rand(1,N).^(1./[N:-1:1]);
t2=toc
end
从哪里获得
t1 =
4.8445e-05
t2 =
1.4369e-05
我有一块NVIDIA GTX850M显卡。我是否错误地使用了gpuArray
?此代码包装在一个函数中,该函数被循环调用数千次。
推荐答案
为什么?
因为
a)小问题规模
&
b)不是"数学密集"的图形处理器内核
比较方法模糊了问题的根本原因
第0步:将数据集(向量)创建与测试部分分开:
N = 10;
R = rand( 1, N );
tic; < a-gpu-based-computing-section>; GPU_t = toc
tic; c = R.^( 1. / [N:-1:1] ); CPU_t = toc
第1步:测试伸缩:
只尝试10个元素不会让观察结果变得清晰,因为简单的formulation of Amdahl Law没有明确强调额外的时间,即花费在基于CPU的GPU内核组装和传输+(CPU到GPU+GPU到CPU)数据处理阶段的时间。如果与
相比,这些附加阶段可能会变得微不足道
a)确实是大规模的向量/矩阵GPU内核处理,N~10显然不是
或
b)确实是"数学密集型"的GPU内核处理,R.^()
显然不是
因此,
不要责怪GPU计算获得了一个必须完成的部分(管理费用),因为如果没有这个先前的附加组件,它就无法及时开始工作(CPU可能会在相同的时间内产生最终结果-Q.E.D.)
每个CPU-GPU-CPU-WORKLOW部分的细粒度测量:
N = 10; %% 100, 1000, 10000, 100000, ..
tic; CPU_hosted = rand( N, 'single' ); %% 'double'
CPU_gen_RAND = toc
tic; GPU_hosted_IN1 = gpuArray( CPU_hosted );
GPU_xfer_h2d = toc
tic; GPU_hosted_IN2 = rand( N, 'gpuArray' );
GPU_gen__h2d = toc
tic; <kernel-generation-with-might-be-lazy-eval-deferred-xfer-setup>;
GPU_kernel_AssyExec = toc
tic; CPU_hosted_RES = gather( GPU_hosted_RES );
GPU_xfer_d2h = toc
这篇关于为什么在这段代码中,CPU运行得比GPU快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文